如何通过内置的@ Html.EditorFor(..)编辑数组proreprty?

时间:2017-02-06 18:07:06

标签: asp.net-mvc razor

我获得ProductModel财产public ProductCategoryModel Category { get; set; }ProductCategoryModel显然是要动态添加或删除的类别集。因此,在创建/编辑ProductModel时,我需要一个包含现有类别的1-value-onle下拉列表。我可以以某种方式为此目的使用@Html.EditorFor(...)吗?

我现在进行的解决方案是

@Html.DropDownList(
            "CategoryTitle",
            SelectListGenerator.GenerateFrom(categoires, i => i.Title, i => i.Title),
            new { htmlAttributes = new {
                @class = "form-control",
                @data_val = "true",
                @data_val_required = "Не выбрана категория!",
                @id = "CategoryTitle",
                @name = "CategoryTitle"
            } })

因为它不返回ProductCategoryModel对象,而只返回字符串 - 它的名称,我被迫在我的控制器中做额外的工作:

public ActionResult Create(CreateProduct_ViewModel vm)
    {
        vm.ProductModel.Category = _productCategoryEntities.ByName(vm.CategoryTitle);
        ValidateModel(vm);
        if (ModelState.IsValid)
        {               
            _productEntities.Products.Add(vm.ProductModel);
            _productEntities.SaveChanges();

            return RedirectToAction(nameof(Index));
        }

        return View(vm);
    }

这段代码看起来有些混乱和缺乏。

所以,再次,在创建新ProductModel时,我需要一个下拉列表,其中可以选择现有类别而不是表单来创建新类别(这是{{1的默认值] }})。我想在我的@Html.EditorFor(...)方法中收到一个ProductModel对象,因此它在指定的Create(...)属性中看起来像Create(ProductModel model),从而避免了这个Category

1 个答案:

答案 0 :(得分:0)

EditorFor是一个模板化的助手。它根据属性类型DataType注释等选择要使用的模板。因为CategoryTitle只是一个字符串,所以您将得到一个标准文本框。

DropDownListFor在这里更合适,因为您需要明确地控制该控件。如果发布的值始终为null,则表示您未正确绑定它。它应该绑定到视图模型上的属性,并且您发布的值应该是相同的类型(或强制该类型)。例如,select元素的发布值将始终为字符串,但如果它类似于" 1",则模型绑定器足够智能以将其绑定到int属性。但是,如果发布的值类似于" true"并且您试图将其绑定到int,它不会绑定,因为" true"不能强制转换为int。这是一个人为的例子,但它只是为了说明这一点。

必须按发布的值查找类别是不可避免的。同样,发布的值将是一个字符串。无法从select元素发布整个类别对象。因此,您可以做的最好的事情是使用已发布的值来查找类别对象,然后将其与类别属性相关联。