Как создать многоцелевое частичное представление, которое отображает элементы управления с различными значениями имени в asp.net mvc 2? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть веб-приложение, в котором все данные находятся в одной таблице и, следовательно, содержатся в одном объекте класса.Структура таблицы примерно такая:

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 были использованы для предоставления значений элементу управления в качестве его модели?

У меня ужасная ловкостьтрудный путь, и я не собираюсь этого делать, но когда я попытался просто разбить его на объекты List of Goal и использовать этот список в качестве свойства в классе основной записи, мне просто казалось, что все мое приложение должно изгибаться вокруг этогонеловкость.Приложение превратилось в беспорядочный запутанный беспорядок, все из-за наличия простого слоя представления.

РЕДАКТИРОВАТЬ 1

Я попробовал ваше предложение (я).Кажется, что помощник Html.TextBoxFor всегда упрям ​​(я сталкивался с этим в прошлом) и не буду называть элементы, как я инструктирую.Вот что я сделал.

Мой частичный вид выглядит следующим образом:

<%@ 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.Источник отрисованной страницы выглядит следующим образом:

<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 вручную, как было предложено, но я не первый раз вижу, как помощники "..For" делаютэтот.Хотелось бы узнать почему и как это исправить.Мысли?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Я бы предложил создать новый класс Model 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;}
}

И передать этот класс в ваше представление вместо отдельных полей, заполнив свойство Name значением "GoalX" длякаждая цель.

Внутри представления при написании кода для создания текстовых полей (я предполагаю, что вы используете помощник TextBoxFor ()) вы можете сделать следующее:

<%= Html.textBoxFor(model => model.Comments, new {name = model.Name + "Comments"}) %>

и т. д.

0 голосов
/ 02 декабря 2011

У вас может быть модель для частичного просмотра с 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.Мне это кажется против всего смысла Для Помощников.Они предназначены для строгой настройки ваших элементов управления в вашей модели.Если вы действительно хотите использовать помощников, вы можете использовать простые.

как:

<%=html.TextBox("goal" + model.GoalNumber + "comments", model.Comments)%>
...