MVC-3 DropdownList或DropdownListFor - 无法在控制器POST中保存值

时间:2011-12-05 09:19:05

标签: asp.net-mvc-3 drop-down-menu html.dropdownlistfor

我搜索了几个小时(或几天),但还没有找到解决方案。我想使用DropdownListFor编辑一个客户,用于使用正确的预选值进行称呼。

我有3个实体(数据库第一个概念,这不是我自己的设计...):客户,地址,称呼

CUSTOMER有一个address_id(f_key),一个ADDRESS有一个salutation_id(f_key)。例如,ADDRESS包含名字和姓氏。在SALUTATION实体内部有一个列sal1,它包含所有可能的称呼。

现在,我想通过ViewModel编辑我的客户,如下所示:

public class CustomerViewModel
{
    public CUSTOMER cust { get; set; }
    public SelectList salutationList { get; set; }

    CustomerRepository repository = new CustomerRepository();

    public CustomerViewModel(int id)
    {
        cust = repository.GetCustomerByIdAsQueryable(id).Single();
        salutationList = new SelectList(repository.GetSalutations(), cust.ADDRESS.SALUTATION.SAL1);
    }
    // Some more
}

CutsomerRepository方法:

public class CustomerRepository
    {
        private MyEntities db = new MyEntities();

        public IQueryable<CUSTOMER> GetCustomerByIdAsQueryable(int id) {...}

        public IQueryable<CUSTOMER> GetCustomersByName(string firstName, string lastName, int maxCount)  {...}

        public List<string> GetSalutations()
        {
            var salutationList = new List<string>();
            var salutationListQry = from s in db.SALUTATION
                                    select s.SAL1;
            salutationListTemp.AddRange(salutationListQry);
            return salutationList;
        }
        // ...
    }

这是我的控制器方法:

[HttpPost]
public ActionResult CustomerData(int id, FormCollection fc)
{
    var vm = new CustomerViewModel(id);
    // Why do I need the following line?
    vm.cust = repository.GetCustomerByIdAsQueryable(id).Single();
    try
    {
        UpdateModel(vm, fc);
        repository.Save();
        return View("CustomerData", vm);
    }
    catch (Exception e)
    {
        return View();
    }
}

最后是我视图中的部分:

@model WebCRM.ViewModels.CustomerViewModel
@using (Html.BeginForm())
{
    // ...
    <div class="editor-label">
        @Html.Label("Salutation:")
        @Html.DropDownListFor(model => model.cust.ADDRESS.SALUTATION.SAL1, Model.salutationList)
        // @Html.DropDownList("Salutation", Model.salutationList)
    </div>
    <div class="editor-label">
    </div>
    <div class="editor-field">
        @Html.Label("Last name:")
        @Html.EditorFor(model => model.cust.ADDRESS.LASTNAME)
        @Html.ValidationMessageFor(model => model.cust.ADDRESS.LASTNAME)
    </div>
    <p>
        <input type="submit" value="Speichern" />
    </p>
}

更改和保存姓氏可以正常工作。但是当保存称呼时,它会将SALUTATION实体中的SAL1值更改为我在DropdownListFor中选择的值。我想要的是为我的客户更改ADDRESS实体内的salutation_id。为什么不起作用?

另一个奇怪的行为:当我在CustomerController中删除标记的行时,我甚至无法更改并保存姓氏。通常,CustimerViewModel的构造函数会设置客户。那么为什么我必须拥有在ViewModel中设置客户的代码行?这是重复的,但必须在那里......

提前致谢。

1 个答案:

答案 0 :(得分:1)

您需要在列表中包含Selected属性。

我可以告诉你我的工作实例:

public static IEnumerable<SelectListItem> GetCountries(short? selectedValue)
    {
        List<SelectListItem> _countries = new List<SelectListItem>();
        _countries.Add(new SelectListItem() { Text = "Select country...", Value = "0", Selected = selectedValue == 0 });
        foreach (var country in ObjectFactory.GetInstance<DataRepository>().GetCountries())
        {
            _countries.Add(new SelectListItem()
            {
                Text = country.Name,
                Value = country.ID.ToString(),
                Selected = selectedValue > 0 && selectedValue.Equals(country.ID)
            });
        }
        return _countries;
    }  

在控制器中,我将其存储到viewbag中:

ViewBag.Countries = CompanyModel.GetCountries(0);

在视图中:

@Html.DropDownListFor(m => m.CompanyModel.CountryId, (IEnumerable<SelectListItem>)ViewBag.Countries)