ASP.Net MVC:当表单发布时,一个视图模型属性变为null

时间:2016-03-24 10:11:12

标签: asp.net-mvc-4

我有一个简单的表单,其中一个下拉列表和一个提交按钮。我有两个索引函数一个用于获取,一个用于表单帖子。当我从下拉列表中选择一个产品并单击提交按钮然后我的索引操作会被调用,但我注意到我的产品属性变为null。请看我的代码告诉我我犯了哪个错误。

查看代码

@model  AuthTest.Models.SampleViewModel

@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>DateValTest</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Products, htmlAttributes: new { @class = "control-label col-md-2", style = "padding-top:0px;" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.SelectedProductId, new SelectList(Model.Products, "ID", "Name"), "-- Select Product--")
                @Html.ValidationMessageFor(model => model.SelectedProductId, "", new { @class = "text-danger" })
            </div>
        </div>



        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Submit" class="btn btn-default" />
            </div>
        </div>
    </div>
}

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

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")

}

型号代码

  public class Product
    {
        public int ID { set; get; }
        public string Name { set; get; }
    }

    public class SampleViewModel
    {
        [Display(Name = "Products")]
        public List<Product> Products { set; get; }

        [Required(ErrorMessage = "Select any one")]
        public int SelectedProductId { set; get; }    
    }

控制器代码

public class TestValController : Controller
{
    // GET: TestVal
    public ActionResult Index()
    {
        var SampleVM = new SampleViewModel();
        SampleVM.Products = new List<Product>
        {
            new Product{ ID=1, Name="IPhone" },
            new Product{ ID=2, Name="MacBook Pro" },
            new Product{ ID=3, Name="iPod" }           
        };
        return View(SampleVM);
    }

    [HttpPost]
    public ActionResult Index(SampleViewModel vm)
    {

        var SampleVM = new SampleViewModel();
        SampleVM.Products = new List<Product>
        {
            new Product{ ID=1, Name="IPhone" },
            new Product{ ID=2, Name="MacBook Pro" },
            new Product{ ID=3, Name="iPod" }           
        };

        if (ModelState.IsValid)
            return View(vm);
        else
            return View(SampleVM);
    }
}

当我调试第二个动作时,我看到vm products property getting null 请告诉我我犯了哪个错误?

感谢

2 个答案:

答案 0 :(得分:0)

@Mou,

请修改您的剃刀视图并尝试此操作。 在Razor View中你没有指定Http动词(Get,Post)。

@using (Html.BeginForm("Index", "TestVal", FormMethod.Post)

答案 1 :(得分:0)

您没有犯任何错误,您没有收到产品列表,因为您没有将它们包含在HTML输入表单中。

如果要包含产品列表,可以在输入表单中添加以下内容

x = "Hello" & chrw$(29) & "World"
?x
HelloWorld

?left$(x, instr(x, chrw$(29)) - 1)
Hello