我如何使一个多用途的部分视图,呈现控件与不同的名称值在asp.net mvc 2
本文关键字:mvc net asp 多用途 何使一 视图 控件 | 更新日期: 2023-09-27 18:16:23
我有一个web应用程序,其中所有数据都在一个表中,因此包含在一个类对象中。表的结构类似于:
GoalId
Goal1Comments
Goal1Results
Goal1Weight
Goal1Rating
Goal2Comments
Goal2Results
Goal2Weight
Goal2Rating
Goal3Comments
Goal3Results
Goal3Weight
Goal3Rating
Goal4Comments
Goal4Results
Goal4Weight
Goal4Rating
从重复中可以看出,有四个目标,但每个目标都显示相同。我尝试过基于这个类创建一个单一目标对象和一个对象列表的方法,但这使我的应用程序从头到尾都很复杂。
我想弄清楚的是如何制作一个局部视图,将从这个目标记录中获取4个值-我希望它显示的特定4个值,但给结果控件一个特定的名称值。换句话说,我希望将数据传递给这个部分视图,并让它以如下方式呈现它的html元素:
<input type="text" name="goal1comments" />
<input type="text" name="goal1results" />
<input type="text" name="goal1Weight" />
<input type="text" name="goal1Rating" />
<input type="text" name="goal2comments" />
<input type="text" name="goal2results" />
<input type="text" name="goal2Weight" />
<input type="text" name="goal2Rating" />
<input type="text" name="goal1comments" />
<input type="text" name="goal1results" />
<input type="text" name="goal1Weight" />
<input type="text" name="goal1Rating" />
<input type="text" name="goal2comments" />
<input type="text" name="goal2results" />
<input type="text" name="goal2Weight" />
<input type="text" name="goal2Rating" />
然而,我的父视图将简单地对部分视图进行四次调用,并传递必要的数据。例子:
<% Html.RenderPartial("Goal",
Model.Goal1Comments , Model.Goal1Results,
Model.Goal1Weight, Goal1Rating); %>
<% Html.RenderPartial("Goal",
Model.Goal2Comments , Model.Goal2Results,
Model.Goal2Weight, Goal2Rating); %>
<% Html.RenderPartial("Goal",
Model.Goal3Comments , Model.Goal3Results,
Model.Goal3Weight, Goal3Rating); %>
<% Html.RenderPartial("Goal",
Model.Goal4Comments , Model.Goal4Results,
Model.Goal4Weight, Goal4Rating); %>
我甚至不知道如果我问的是可能的,但是有没有一种方法为部分控件命名的html控件,它创建基于传入他们的字段的名称?所以,第一次呈现部分时,它知道Goal1Comments、Goal1Results、Goal1Weight和Goal4Rating是用来向控件提供值的属性,就像它的模型一样?
我有一个可怕的诀窍,用困难的方式做事情,我不是故意的,但是当我试图简单地把它分解成一个目标对象的列表,并把这个列表作为主记录类的属性时,它看起来就像我的整个应用程序不得不弯曲自己来解决这个尴尬。为了一个简单的视图层,应用程序变得混乱不堪。
编辑1
我已经试过你的建议了。似乎Html。TextBoxFor helper永远是顽固的(我在过去遇到过这种情况),并且不会在我指示时命名元素。这是我所做的。我的局部视图是这样的:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PartialControlTesting.Models.IndividualGoal>" %>
<fieldset>
<legend>Fields</legend>
<div class="display-label">HtmlName: <%= Html.Encode(Model.HtmlName) %></div>
<div class="display-label">GoalRating</div>
<div class="display-field"><%= Html.TextBoxFor(x=>x.GoalComments, new { name = Model.HtmlName + "Comments"} ) %></div>
<div class="display-label">GoalWeight</div>
<div class="display-field"><%= Html.TextBoxFor(x=>x.GoalWeight, new { name = Model.HtmlName + "Weight"} ) %></div>
<div class="display-label">GoalComments</div>
<div class="display-field"><%= Html.TextBoxFor(x=>x.GoalRating, new { name = Model.HtmlName + "Rating"} ) %></div>
</fieldset>
我的父视图是这样的:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<PartialControlTesting.Models.GoalData>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Home Page
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<br />
<% using (Html.BeginForm())
{%>
<% Html.RenderPartial("Goal",
new PartialControlTesting.Models.IndividualGoal(
Model.Goal1Rating, Model.Goal1Weight,
Model.Goal1Comments, "Goal1")); %>
<% Html.RenderPartial("Goal",
new PartialControlTesting.Models.IndividualGoal(
Model.Goal2Rating, Model.Goal2Weight,
Model.Goal2Comments, "Goal2")); %>
<p>
<input type="submit" id="submit" value="Submit" />
</p>
<% } %>
</asp:Content>
HtmlName值被正确地传递到局部视图中,但是控件使用它们所创建的属性的名称来呈现,并且忽略了我附加的html属性name参数。所呈现页面的源代码如下所示:
<fieldset>
<legend>Fields</legend>
<div class="display-label">HtmlName: Goal1</div>
<div class="display-label">GoalRating</div>
<div class="display-field"><input id="GoalComments" name="GoalComments" type="text" value="g1 comments" /></div>
<div class="display-label">GoalWeight</div>
<div class="display-field"><input id="GoalWeight" name="GoalWeight" type="text" value="20" /></div>
<div class="display-label">GoalComments</div>
<div class="display-field"><input id="GoalRating" name="GoalRating" type="text" value="1" /></div>
</fieldset>
我可以像建议的那样手动构建html控件,但这不是我第一次看到"…对于"帮助者做这个"。我想知道为什么和如何解决它。想法吗?
您可以为您的局部视图创建一个视图模型,其中包含目标的4个属性,也许还有目标编号。
那么你可以这样做:
<% Html.RenderPartial("Goal", new GoalViewModel(model.Goal4Comments, model.Goal4Results, model.Goal4Weight, model.Goal4Rating, 4)%>
我来自vb.net背景,所以语法可能会更准确。
在你的视图中你必须有这样的东西:
<input type="text" id="goal<%=model.GoalNumber%>comments" name="goal<%=model.GoalNumber%>comments" />
编辑:在这种情况下,我不会使用TextBoxFor帮助器。在我看来,这似乎违背了"为帮手"的宗旨。它们用于将控件强类型输入到模型中。如果真的想使用helper,可以使用普通的helper。:
<%=html.TextBox("goal" + model.GoalNumber + "comments", model.Comments)%>
我建议像这样创建一个新的Model class Goal:
public class Goal
{
public string Comments{get;set;}
public string Results{get;set;}
public string Weight{get;set;}
public string Rating{get;set;}
public string Name {get;set;}
}
将这个类传递给你的视图,而不是单独的字段,用每个目标的"GoalX"值填充Name
属性。
在视图内部编写生成文本框的代码时(我假设您使用TextBoxFor() helper),您可以执行以下操作:
<%= Html.textBoxFor(model => model.Comments, new {name = model.Name + "Comments"}) %>
等。