ASP .NET MVC3, как отправить данные из частичного просмотра - PullRequest
0 голосов
/ 08 июня 2011

Здесь и Сценарий: я настроил пару ViewModels, как:

public class ThreadEditorView
{
    public int ForumID { get; set; }
    public ThreadEditorPartialView ThreadEditor { get; set; }
    public ThreadEditorSpecial ThreadSpecial { get; set; }
}

Теперь у меня есть и View:

@using (Html.BeginForm("NewThread", "Thread", FormMethod.Post, 
    new {@enctype="multipart/form-data"})) {

    @Html.ValidationSummary(true)
    <fieldset>
        @Html.Partial("_ThreadEditor", Model.ThreadEditor)
        @Html.Partial("_SpecialProperties", Model.ThreadSpecial)
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Вопрос в том, как передать данные из частичных представлений вконтроллер?Я знаю, что могу просто сделать это:

public ActionResult NewThread(ThreadEditorView modelEditor, 
    ThreadEditorPartialView blabla, ThreadEditorSpecial zumg)

Но это выглядит не очень удобно, я хотел бы передать все в ThreadEditorView.

Обновление: SpecialView

@model Vaniv.Core.ViewModel.Forums.ThreadEditorSpecial

        <div class="editor-label">
            @Html.LabelFor(model => model.IsSticky)
        </div>
        <div class="editor-field">
            @Html.RadioButtonFor(model => model.IsSticky, false)
            @Html.ValidationMessageFor(model => model.IsSticky)
        </div>
(some irrevalnt forms)
        <div class="editor-field">
            @Html.EditorFor(model => model.IsLocked)
            @Html.ValidationMessageFor(model => model.IsLocked)
        </div>

И редактор:

@model Vaniv.Core.ViewModel.Forums.ThreadEditorPartialView


    <legend>ThreadEditorPartialView</legend>
    @Html.HiddenFor(model => model.ForumID)
    <div class="editor-label">
        @Html.LabelFor(model => model.ThreadName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ThreadName)
        @Html.ValidationMessageFor(model => model.ThreadName)
    </div>

(некоторые формы, которые не имеют отношения к делу)

    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Message)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.Message)
        @Html.ValidationMessageFor(model => model.Message)
    </div>

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Я бы порекомендовал вам использовать шаблоны редакторов вместо частичных, поскольку они позаботятся о создании собственных имен для ваших полей ввода, чтобы механизм связывания модели мог правильно разрешить значения в действии POST:

@using (Html.BeginForm("NewThread", "Thread", FormMethod.Post, 
    new {@enctype="multipart/form-data"})) {

    @Html.ValidationSummary(true)
    <fieldset>
        @Html.EditorFor(x => x.ThreadEditor)
        @Html.EditorFor(x => x.ThreadSpecial)
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

и иметь соответствующие шаблоны редактора (обратите внимание, что имена и расположение шаблонов редактора важны):

~/Views/Shared/EditorTemplates/ThreadEditorPartialView.cshtml

@model ThreadEditorPartialView
<legend>ThreadEditorPartialView</legend>
@Html.HiddenFor(model => model.ForumID)
<div class="editor-label">
    @Html.LabelFor(model => model.ThreadName)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.ThreadName)
    @Html.ValidationMessageFor(model => model.ThreadName)
</div>

и ~/Views/Shared/EditorTemplates/ThreadEditorSpecial.cshtml:

@model ThreadEditorSpecial
...

Теперь действие вашего контроллера может выглядеть так:

public ActionResult NewThread(ThreadEditorView modelEditor) 
{ 
    ...
}
0 голосов
/ 08 июня 2011

Как выглядят _ThreadEditor и _SpecialProperties?

Если для партиалов введены значения ThreadEditorPartialView и ThreadEditorSpecial соответственно, ASP.NET MVC будет отображать текстовые поля с именами, которые помогут ему правильно связать модель на POST:

_ThreadEditor:

@model ThreadEditorPartialView
// rest of the view here

_SpecialProperties:

@model ThreadEditorSpecial
// rest of the view here

При правильно введенных партиалах вашему действию требуется только один параметр:

public ActionResult NewThread(ThreadEditorView modelEditor) { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...