简体   繁体   English

HTTP POST上的模型为空

[英]Model is Empty on HTTP POST

Controller 调节器

[HttpPost]
public ActionResult SaveProduct(string id, AddProductViewModel m)
{
    if (ModelState.IsValid)
    {
        using (ComparisonDBDataContext CMP = new ComparisonDBDataContext())
        {
            tblProduct prod = (from c in CMP.tblProducts
                               where c.ProductID == Guid.Parse(id)
                               select c).SingleOrDefault();
            prod.Name = m.myName;
            prod.CategoryID = Guid.Parse(m.myCategory);
            prod.ManufacturerID=Guid.Parse(m.myManufacturer);
            CMP.SubmitChanges();
        }
        return RedirectToAction("Products");
    }
    else
    {
        m.ProductID = Guid.Parse(id);
        return View("EditProduct", m);
    }
}

View 视图

@model Comparison.Models.AddProductViewModel 
@{
    ViewBag.Title = "EditProduct";
    Layout = "~/Views/_LayoutData.cshtml";
}

<style>
    .field-validation-error {
        color: Black;
    }
    .validation-summary-errors {
        font-weight: bold;
        color: Black;
    }
</style>
<h2>Edit Product</h2>
@using (Html.BeginForm("SaveProduct", "Home", new { id = @Model.ProductID }, FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true)
        <div class="form-group">
            <label class="control-label col-md-2" id="lblName">Name</label>
            <div class="col-md-5">
                @Html.TextBoxFor(m => m.myName, new { @class = "form-control" })
                @Html.ValidationMessageFor(m => m.myName)
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-md-2" id="lblCategory">Category</label>
            <div class="col-md-5">
                @Html.DropDownListFor(m => m.myCategory,  Model.Category, new { @class = "form-control" })
                @Html.ValidationMessageFor(m => m.myCategory)
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-md-2" id="lblManufucturer">Manufucturer</label>
            <div class="col-md-5">
                @Html.DropDownListFor(m => m.myManufacturer, Model.Manufacturer, new {@class="form-control" })
                @Html.ValidationMessageFor(m => m.myManufacturer)
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Products")
</div>

View Model 查看模型

public Guid? myUserID;

        [Required(ErrorMessage="Required")]
        public string myCategory;
        public List<SelectListItem> category = new List<SelectListItem>();
        public List<SelectListItem> Category
        {
            get
            {

                category.Clear();
                using (ComparisonDBDataContext CMP = new ComparisonDBDataContext())
                {
                    var cat = from g in CMP.tblCategories
                              select new { g.Name, g.CategoryID };
                    foreach (var q in cat)
                    {
                        category.Add(new SelectListItem() { Text = q.Name, Value = q.CategoryID.ToString() });
                    }
                    return category;
                }
            }
        }
        public Guid? ProductID;

        [Required(ErrorMessage = "Required")]
        public string myManufacturer;
        public List<SelectListItem> manufacturer = new List<SelectListItem>();
        public List<SelectListItem> Manufacturer
        {
            get
            {

                category.Clear();
                using (ComparisonDBDataContext CMP = new ComparisonDBDataContext())
                {
                    var manu = from g in CMP.tblManufacturers
                              select new { g.Name, g.ManufacturerID };
                    foreach (var q in manu)
                    {
                        manufacturer.Add(new SelectListItem() { Text = q.Name, Value = q.ManufacturerID.ToString() });
                    }
                    return manufacturer;
                }
            }
        }

        [Required(ErrorMessage = "Required")]
        [StringLength(100, ErrorMessage = "Maximum lenght can be 100")]
        public string myName;

        public DateTime? CreationDate;

I have tried googling it but could not find any solutions. 我尝试使用Google搜索,但找不到任何解决方案。

I know similar questions are already asked but i couldn't find my solution in them. 我知道已经问过类似的问题,但是我在其中找不到解决方案。 So kindly just review my code and tell me what I am doing wrong. 因此,请检查我的代码并告诉我我做错了什么。 Why my Model is empty ON POSTBACK? 为什么我的模型在回发时为空?

Your view model contains properties with only getters (and in some case they are just fields without any getter or setter) so the DefaultModelBinder cannot set their values. 您的视图模型包含仅具有getter的属性(在某些情况下,它们只是没有任何getter或setter的字段),因此DefaultModelBinder无法设置其值。 It needs to be 它必须是

public string myName { get; set; }

Side note: A view model should not contain database access code. 旁注:视图模型不应包含数据库访问代码。 It shouldbe simply 应该简单

public List<SelectListItem> manufacturer { get; set; }

and the controller should be responsible for assigning the collection to the property. 并且控制者应负责将集合分配给属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM