Частичные представления MVC, передающие модель контроллеру

Прежде всего, я должен сказать, что я новичок в MVC, но изучаю его, когда использую его в проекте.

В настоящее время у меня есть проблема, которая, я думаю, связана с моим непониманием MVC. Вот схема того, что у меня есть:

Контроллер: PersonController

Модель: PersonIndexModel PersonFindAddressModel (почтовый индекс, список возможных адресов) PersonNewAddressModel (первая строка, вторая строка, почтовый индекс)

View: RegisterAddress (использует PersonIndexModel, включает оба частичных представления). FindAddress (использует PersonFindAddressModel) NewAddress (использует PersonNewAddressModel).

Что я собираюсь сделать, так это то, что при регистрации пользователь вводит почтовый индекс. У меня есть кнопка отправки html, которая затем возвращается к контроллеру, проверяет имя нажатой кнопки, и если это «найти почтовый индекс», она возвращает список возможных адресов (используя PersonFindAddressModel).

Если пользователь выбирает, что адреса нет в списке, он снова возвращается в то же место, что и раньше, проверяет, какая кнопка была нажата (в данном случае «адрес не найден»), скрывает часть «Найти адрес» и показывает часть «Новый адрес».

Новый адрес содержит обычные формы адресов и кнопку для отправки. Я попытался создать новый ActionLink для вызова чего-либо в PersonController, но это не так.

Где я ошибаюсь? Должны ли партиалы иметь контроллеры?

Чтобы быть более конкретным, вот мой код:

Адрес регистрации

@Html.Partial("FindAddress")
@Html.Partial("NewAddress", new PersonNewAddressModel())

НайтиАдрес

@model PersonFindAddressModel
@using (Html.BeginForm("RegisterAddress", "Person"))
{
if (@ViewBag.NewAddress != true)
{
    @Html.TextBoxFor(m=> m.PostCode)

    <button type="submit" value="findaddress" name="command">Find Address</button>


    if (Model != null && Model.AddressList != null && Model.AddressList.Count > 0)
    {
        <div class="selectproperty">
            @Html.DropDownList("selectaddress", new SelectList(Model.AddressList, "value", "text"))
        </div>

        <div>
            <button type="submit" value="notinlist" name="command"> Not in the list?</button>
        </div>
    }

}

Новый адрес

@model PersonNewAddressModel

@{
    ViewBag.Title = "FindAddress";
}

@using (Html.BeginForm("RegisterAddress", "Person"))
{
 if (@ViewBag.NewAddress == true)
   {
    @Html.TextBoxFor(m=> m.Street)

    @Html.ActionLink("Submit", "SubmitNew")
}
}

Персонаконтроллер

public class PersonController : Controller
{
[HttpPost]
    public ActionResult RegisterAddress(PersonFindAddressModel model, string command)
    {
        switch (command)
        {
            case "findaddress":
                PostcodeLookup(model);
                break;

            case "notinlist":
                ViewData.Add("NewAddress", true);
                break;

        }

        return View(model);
    }

 public ActionResult SubmitNew(PersonNewAddressModel model)
    {

        return View(model);
    }

Любая помощь будет принята с благодарностью!


person Andy Jones    schedule 01.05.2013    source источник


Ответы (1)


Вы можете использовать один и тот же контроллер для всех функций. Вам не нужны отдельные контроллеры для ваших партиалов.

Что касается вашего «вызываемого метода и определения имени нажатой кнопки», вам это не нужно. Каждая кнопка может вызывать разные действия на контроллере. Лично я бы использовал две формы в представлении FindAddress:

@model PersonFindAddressModel
@using (Html.BeginForm("FindAddress", "Person"))
{
    if (@ViewBag.NewAddress != true)
    {
        @Html.TextBoxFor(m => m.PostCode)
        <input type="submit" value="Find" />
    }
}

if (Model.AddressList != null && Model.AddressList.Count > 0)
{
    @using (Html.BeginForm("SaveAddress", "Person")
    {
        <div class="selectproperty">
            @Html.DropDownList("selectaddress", new SelectList(Model.AddressList, "value", "text"))
        </div>

        <div>
            <input type="submit" value="Save" />
            @Html.ActionLink("Not in list","NotInList")
        </div>
    }
}

Ваши действия для них:

public ActionResult FindAddress(PersonFindAddressModel model)
{
    var address = PostcodeLookup(model);

    // bind found address to PersonFindAddressModel

    return View(model);
}

public ActionResult NotInList()
{
    ViewData.Add("NewAddress", true);
    return RedirectResult("Index");
}

public ActionResult SaveAddress(PersonFindAddressModel model)
{
    // save address from model and do any redirecting ect.
}

Для представления AddNewAddress:

@model PersonNewAddressModel

@using (Html.BeginForm("SubmitNewAddress", "Person"))
{
    @Html.TextBoxFor(m => Model.Street)
    <input type="submit" value="Add New" />
}

А затем добавьте действие для SubmitNewAddress:

public ActionResult SubmitNew(PersonNewAddressModel model)
{
    // save new address and redirect
}
person wellers    schedule 01.05.2013
comment
Большое спасибо. Я рассмотрю ваше предложение и постараюсь реализовать его. - person Andy Jones; 02.05.2013