【问题标题】:Cannot pass Model from View To Controller on FormSubmit表单提交时无法将模型从视图传递到控制器
【发布时间】:2014-05-29 18:45:31
【问题描述】:

每次此表单回发时,我都会在我的控制器中将 viewmodel 设为 null。有人可以帮我看看我在这里缺少什么吗?

这是我的视图模型

public class CarViewModel
{
    [Required(ErrorMessage = "Please enter the Reg No")]
    public string RegNo { get; set; }

    [Required(ErrorMessage = "Please enter Model")]
    public string CarModel { get; set; }

    [Required(ErrorMessage = "Please select one of the status")]
    public int? Status { get; set; }

    [Required(ErrorMessage = "Please enter colour")]
    public string Colour { get; set; }

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

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

这是我的控制器

   [HttpGet]
    public ActionResult Create()
    {
        CarViewModel model = new CarViewModel();
        var statusList = _service.GetAllStatusList();
        var modelList = _service.GetAllModelList();
        model.Statuses = statusList.Select(x => new SelectListItem
        {
            Text = x.description,
            Value = x.id.ToString()
        }).ToList();

        model.ModelList = modelList.Select(x => new SelectListItem
        {
            Text = x.model_name,
            Value = x.model_id.ToString()
        }).ToList();

        return View(model);
    }

    //
    // POST: /CarRental/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CarViewModel model)
    {
        try
        {
            // TODO: Add insert logic here
            if (ModelState.IsValid)
            {
                car car = new car { colour = model.Colour, registration = model.RegNo, status = model.Status };
                _service.RegisterCar(car);
                return View(model);
            }
            else
            {
                return View(model);
            }
            //  return RedirectToAction("Index");
        }
        catch (Exception)
        {
            return View(model);
        }
    }

这是我的观点

   @model CarRentalUI.Models.CarViewModel
   @{
     ViewBag.Title = "Create";
   }

   <h2>Create</h2>

   @using (Html.BeginForm("Create","CarRental",FormMethod.Post))
   {
       @Html.AntiForgeryToken()
       @Html.ValidationSummary(true)   
       @Html.LabelFor(x=>x.RegNo)
       @Html.TextBoxFor(x=>x.RegNo)         
       @Html.ValidationMessageFor(x=>x.RegNo)
       <br/>
      @Html.LabelFor(x=>x.CarModel)         
      @Html.DropDownListFor(x=>x.CarModel,Model.ModelList,"Please Make a Selection")
      @Html.ValidationMessageFor(x=>x.Model)

      <br/>
      @Html.LabelFor(x=>x.Status)         
      @Html.DropDownListFor(x=>x.Status, Model.Statuses,"Please Make a Selection")    
      @Html.ValidationMessageFor(x=>x.Status)

      <input type="submit" value="Submit" id="submitButton"/>
  }

【问题讨论】:

  • 这里为什么需要隐藏控制?
  • 试试 html.editorfor 代替 html.textboxfor 然后看看
  • @Sike12 你不需要那个隐藏字段。当您需要模型绑定时使用它,但似乎这里的问题有所不同。看起来可疑的第一件事是 Model 属性,它是有效的关键字。是否可以将属性名称从 Model 更改为 CarModel 或类似的东西,看看是否有变化?
  • 你需要删除HiddenFor的
  • @Sike12 您正在以错误的方式创建DropDownListFor。请在此处查看此问题以获得一些指导 - stackoverflow.com/questions/19476530/…。请记住,Status 可能不能为空。我不确定,但让它与 int 一起工作,然后尝试将其更改为 int?

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5


【解决方案1】:
  • 移除 HiddenFor 的
  • 确保 statuses 的值是可解析的 int 的
  • 添加颜色下拉菜单

我刚刚根据您的示例代码创建了一个测试项目,它似乎可以工作(http://i.imgur.com/PIFACMd.png

【讨论】:

  • 一张简单的图片如何帮助解决OP问题?如果您在答案中添加一些代码会更好。
  • 对不起,我没听懂。
  • 感谢 Leron 和 Matthijsb 两位
【解决方案2】:

使用

return RedirectToAction("Create");

代替

 return View(model);

【讨论】:

  • 这应该没什么区别,MVC 会自动将 Action 名称作为视图名称。除此之外,加载视图工作他只是得到一个空模型
  • 使用return RedirectToAction("Create");
  • 无论哪种方式都一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多