我如何使一个多用途的部分视图,呈现控件与不同的名称值在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控件,但这不是我第一次看到"…对于"帮助者做这个"。我想知道为什么和如何解决它。想法吗?

我如何使一个多用途的部分视图,呈现控件与不同的名称值在asp.net mvc 2

您可以为您的局部视图创建一个视图模型,其中包含目标的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"}) %>

等。