Почему моя модель не принимает то, что я выбираю из DropDownList? - PullRequest
0 голосов
/ 26 августа 2010

Я редактирую Обед (из учебника NerdDinner) и сохраняю его, но Страна не сохраняется. Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace NerdDinner.Models
{
    public class DinnerFormViewModel
    {
        private static string[] _countries = new[]{
            "USA",
            "Bolivia",
            "Canada"
        };

        public Dinner Dinner { get; private set; }
        public SelectList Countries { get; private set; }

        public DinnerFormViewModel(Dinner dinner)
        {
            Dinner = dinner;
            Countries = new SelectList(_countries, dinner.Country);
        }
    }
}

Тогда в моем контроллере я использую его так:

[HttpGet]
public ActionResult Edit(int id)
{
    Dinner dinner = dinnerRepository.GetDinner(id);            

    return View(new DinnerFormViewModel(dinner));
}

[HttpPost]
public ActionResult Edit(int id, FormCollection formValues)
{
    Dinner dinner = dinnerRepository.GetDinner(id);

    if (TryUpdateModel(dinner))
    {
        dinnerRepository.Save();
        return RedirectToAction("Details", new { id = dinner.DinnerID });
    }

    return View(new DinnerFormViewModel(dinner));
}

Тогда вот вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<NerdDinner.Models.DinnerFormViewModel>" %>

<div class="editor-label">
    <%: Html.LabelFor(model => model.Dinner.Country) %>
</div>
<div class="editor-field">
    <%: Html.DropDownListFor(model => model.Dinner.Country, Model.Countries) %>                
    <%: Html.ValidationMessageFor(model => model.Dinner.Country) %>
</div>

При попытке отредактировать существующий ужин и изменить Страну, изменение не сохраняется. Спасибо!

1 Ответ

0 голосов
/ 26 августа 2010

Значит, вы говорите, что когда вы звоните TryUpdateModel(dinner), свойства ужина обновляются в соответствии с формой?

Если это так, потому что Country является дочерним элементом модели, а вы вызываете html-подсказки примерно так: <%: Html.DropDownListFor(model => model.Dinner.Country, Model.Countries) %>, я думаю, что входные данные будут иметь префикс Country.

Попробуйте изменить TryUpdateModel(dinner) на TryUpdateModel(dinner, "Dinner").

HTHS,
Charles

...