C# MVC4-实体框架、视图模型和验证

C# MVC4-实体框架、视图模型和验证,c#,jquery,asp.net-mvc,razor,C#,Jquery,Asp.net Mvc,Razor,我正在为一个项目使用MVC4和实体框架。我有一个创建产品视图,它是用产品视图模型强类型的: public class ProductViewModel { public Product Product { get; set; } public ProductType ProductType { get; set; } public List<SelectListItem> ProductTypes { get; set; } public List&

我正在为一个项目使用MVC4和实体框架。我有一个创建产品视图,它是用产品视图模型强类型的:

public class ProductViewModel
{
    public Product Product { get; set; }
    public ProductType ProductType { get; set; }

    public List<SelectListItem> ProductTypes { get; set; }
    public List<SelectListItem> ProductCompanies { get; set; }

    [RegularExpression(@"^[a-zA-Z0-9àéèêçñ\s][a-zA-Z0-9àéèêçñ\s-]+$", ErrorMessage = "Invalid name !")]
    public string Model { get; set; }

    [RegularExpression(@"^[a-zA-Z0-9àéèêçñ\s][a-zA-Z0-9àéèêçñ\s-]+$", ErrorMessage = "Invalid name !")]        
    public string CompanyName { get; set; }
}
编辑:这是调试器的屏幕截图。当我检查这些值时,键[5]就是问题所在的键


您有没有想过将此字段设置为可选字段,然后通过在下拉列表中选择产品类型来创建新产品?

我想,您有3个选项:

1) 重写正则表达式以支持空值

2) 向viewmodel中添加一些属性(例如bool)并编写自定义验证属性(例如IfPropertyAThenValidate)或类似的内容

3) 如果ViewModel包含现有产品类型,请忽略模型属性: e、 g:


我不认为这是您的问题,但我强烈建议重命名该属性,因为框架使用名称模型。将其命名为ProductModel或其他名称,以减少混淆。以单独的形式添加产品的创建(非嵌套)以避免父级验证,然后使用所选的创建产品重新填充父级dropdownlist。谢谢@MystereMan,我做到了(但我仍然有我的问题,哈哈)@MaximilianoBecerraBustamante感谢您的回答,但要求是集中产品和产品类型,所以我必须这样做…@Traffy,如果您尝试使用数据注释?您可以为每个属性在模型中设置“必填”字段,如果不显式地显示此属性(必需的)<代码> MODENSTATION.ISHORLATION/COD>不考虑验证此属性。数据注释->感谢您的回答。但是,我不知道为什么,问题出在我的ProductType对象上。在我的model.designer(我首先处理数据库)中,model属性设置为required。是的,在您的情况下,它将是ModelState modelofmodel=ModelState[“ProductType.model”];=>在保存实体之前,在服务器端创建新的产品类型
@model BuSIMaterial.Models.ProductViewModel
@{
    ViewBag.Title = "Create a material";
}

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Create a material</legend>
        <div class="editor-label">
            Product type : <a class="product_type" id="product_type_link">Using a new model</a>
        </div>
        <div id= "existing_product_type" class="editor-field">
            @Html.DropDownListFor(p => p.Product.Id_ProductType, Model.ProductTypes)
            @Html.ValidationMessageFor(model => model.Product.Id_ProductType)
        </div>
        <div id="new_product_type">
        <div class="editor-label">
            Model : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Model, new { maxlength = 50, id = "model" })
            @Html.ValidationMessageFor(model => model.Model)
        </div>

        <div class="editor-label">
            Company : <a class="company" id="company_link">Using a new company name</a>
        </div>
        <div id="existing_company" class="editor-field">
            @Html.DropDownListFor(p => p.ProductType.Id_ProductCompany, Model.ProductCompanies)
            @Html.ValidationMessageFor(model => model.ProductType.Id_ProductCompany)
        </div>
        <div id="new_company">
             <div class="editor-label">
                Name : 
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.CompanyName, new { id = "company_name"})
                @Html.ValidationMessageFor(model => model.CompanyName)
            </div>       
        </div>
        </div>
        <div class="editor-label">
            Price :
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Product.CatalogPrice)
            @Html.ValidationMessageFor(model => model.Product.CatalogPrice)
        </div>
        <div class="editor-label">
            Purchase date :
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Product.PurchaseDate, new { @class = "datepicker"})
            @Html.ValidationMessageFor(model => model.Product.PurchaseDate)
        </div>
        <div class="editor-label">
            Serial number :
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Product.SerialNumber, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.Product.SerialNumber)
        </div>
        <div class="form-actions">
          <button type="submit" class="btn btn-primary">Create</button>
        </div>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/themes/base/css")

    <script type="text/javascript">

        $(document).ready(function () {

            $("#product_type_link").click(function () {

                if ($("#new_product_type").css("display") == "block") {

                    $("#new_product_type").css("display", "none");
                    $("#existing_product_type").css("display", "block");
                    $("#product_type_link").text("Using a new model");
                    $("#model").val("");
                    $("#company_name").val("");

                }
                else {
                    $("#new_product_type").css("display", "block");
                    $("#existing_product_type").css("display", "none");
                    $("#product_type_link").text("Using an existing model")
                }
            });

            $("#company_link").click(function () {

                if ($("#new_company").css("display") == "block") {

                    $("#new_company").css("display", "none");
                    $("#existing_company").css("display", "block");
                    $("#company_link").text("Using a new company name");
                    $("#company_name").val("");

                }
                else {
                    $("#new_company").css("display", "block");
                    $("#existing_company").css("display", "none");
                    $("#company_link").text("Using an existing company name")
                }
            });

        });

    </script>

}
[HttpPost]
public ActionResult Create(ProductViewModel pvm)
{
    var productTypeList = from obj in db.ProductTypes orderby obj.ProductCompany.Name ascending where !((from element in db.VehicleTypes select element.Id_ProductType).Contains(obj.Id_ProductType)) select obj;

    ViewBag.Id_ProductType = new SelectList(productTypeList, "Id_ProductType", "Information", pvm.Product.Id_ProductType);
    pvm.ProductTypes = productTypeList.ToList().Select(p => new SelectListItem { Text = p.Information, Value = p.Id_ProductType.ToString() }).ToList();

    ViewBag.Id_ProductCompany = new SelectList(db.ProductCompanies, "Id_ProductCompany", "Name", pvm.ProductType.Id_ProductCompany);
    pvm.ProductCompanies = db.ProductCompanies.ToList().Select(pc => new SelectListItem { Text = pc.Name, Value = pc.Id_ProductCompany.ToString() }).ToList();


    Product product = null;
    ProductType productType = null;

    if (ModelState.IsValid)
    {

        ModelStateDictionary errors = Validator.isValid(pvm.Product);

        if (errors.Count > 0)
        {
            ModelState.Merge(errors);
            return View(pvm);
        }

        if (!string.IsNullOrEmpty(pvm.Model))
        {
            if (!string.IsNullOrEmpty(pvm.CompanyName))
            {
                ProductCompany productCompany = new ProductCompany()
                {
                    Name = pvm.CompanyName
                };

                productType = new ProductType()
                {
                    Model = pvm.Model,
                    ProductCompany = productCompany
                };

                product = new Product()
                {
                    PurchaseDate = pvm.Product.PurchaseDate,
                    SerialNumber = pvm.Product.SerialNumber,
                    CatalogPrice = pvm.Product.CatalogPrice,
                    ProductType = productType
                };
            }
            else
            {
                productType = new ProductType()
                {
                    Model = pvm.Model,
                    Id_ProductCompany = pvm.ProductType.Id_ProductCompany
                };

                product = new Product()
                {
                    PurchaseDate = pvm.Product.PurchaseDate,
                    SerialNumber = pvm.Product.SerialNumber,
                    CatalogPrice = pvm.Product.CatalogPrice,
                    ProductType = productType
                };
            }
        }
        else
        {
            productType = new ProductType()
            {
                Id_ProductType = pvm.ProductType.Id_ProductType,
                Id_ProductCompany = pvm.ProductType.Id_ProductCompany                    
            };

            product = new Product()
            {
                PurchaseDate = pvm.Product.PurchaseDate,
                SerialNumber = pvm.Product.SerialNumber,
                CatalogPrice = pvm.Product.CatalogPrice,
                ProductType = productType
            };
        }

        db.Products.AddObject(product);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(pvm);
}
ModelState modelStateOfModel = ModelState["Model"];

if (modelStateOfModel != null)
{
    modelStateOfModel.Errors.Clear();
}

if (ModelState.IsValid)
{
   ...
}