简体   繁体   English

MVC4:视图似乎保持独立于控制器的状态

[英]MVC4: View appears to be maintaining state independently of the controller

I have a dropdown (customer) and list of checkboxes (sales orders), dependent upon the currently selected customer. 我有一个下拉菜单(客户)和复选框列表(销售订单),具体取决于当前选择的客户。 I would expect the checkboxes to clear if I select a new customer, but they are maintained from one to the other, despite the model being cleared in the postback. 我希望如果选择新客户,复选框也会清除,但是尽管回发中已清除了模型,但它们之间仍然保持不变。

I'm not a seasoned MVC developer, but I'm not sure why this should be. 我不是经验丰富的MVC开发人员,但是我不确定为什么会这样。 When debugging the ViewModel I'm sending back to the view, it is showing IsSelected = false for all the checkboxes, yet in the View, they are selected. 当调试我发送回视图的ViewModel时,它为所有复选框显示IsSelected = false,但是在视图中它们被选中。 What am I doing wrong? 我究竟做错了什么? (Thanks in advance) (提前致谢)

View Model: 查看模型:

namespace MvcTest1.Models
{
    public class Customer
    {
        public int CustomerID { get; set; }
        public string Name { get; set; }
    }

    public class SalesOrder
    {
        public int SalesOrderID { get; set; }
        public string Reference { get; set; }
        public bool IsSelected { get; set; }
    }

    public class SalesOrderPageViewModel
    {
        public List<Customer> Customers { get; set; }
        public int SelectedCustomerID { get; set; }
        public List<SalesOrder> SalesOrders { get; set; }
    }
}

Controller: 控制器:

namespace MvcTest1.Controllers
{
    public class SalesOrderPageController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            SalesOrderPageViewModel viewModel = BuildViewModel(1);

            return View(viewModel);
        }

        [HttpPost]
        public ActionResult Index(SalesOrderPageViewModel viewModelInput)
        {
            SalesOrderPageViewModel viewModel = BuildViewModel(viewModelInput.SelectedCustomerID);

            return View(viewModel);
        }

        public SalesOrderPageViewModel BuildViewModel(int customerID)
        {
            SalesOrderPageViewModel viewModel = new SalesOrderPageViewModel
            {
                Customers = new List<Customer> 
                { 
                    new Customer { CustomerID = 1, Name = "Alan" },
                    new Customer { CustomerID = 2, Name = "Bob" },
                    new Customer { CustomerID = 3, Name = "Charlie" }
                }
            };

            viewModel.SelectedCustomerID = customerID;

            if (customerID == 1)
            {
                viewModel.SalesOrders = new List<SalesOrder>
                {
                    new SalesOrder { SalesOrderID = 11, Reference = "AA11" },
                    new SalesOrder { SalesOrderID = 12, Reference = "AA22" },
                    new SalesOrder { SalesOrderID = 13, Reference = "AA33" }
                };
            }
            if (customerID == 2)
            {
                viewModel.SalesOrders = new List<SalesOrder>
                {
                    new SalesOrder { SalesOrderID = 21, Reference = "BB11" },
                    new SalesOrder { SalesOrderID = 22, Reference = "BB22" },
                    new SalesOrder { SalesOrderID = 23, Reference = "BB33" }
                };
            }
            if (customerID == 3)
            {
                viewModel.SalesOrders = new List<SalesOrder>
                {
                    new SalesOrder { SalesOrderID = 31, Reference = "CC11" },
                    new SalesOrder { SalesOrderID = 32, Reference = "CC22" },
                    new SalesOrder { SalesOrderID = 33, Reference = "CC33" }
                };
            }

            return viewModel;
        }
    }
}

View: 视图:

@model MvcTest1.Models.SalesOrderPageViewModel

@{
    ViewBag.Title = "SalesOrderPage";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>SalesOrderPage</h2>

<br /><br />

@using (Html.BeginForm())
{

    @Html.DropDownListFor(model =>
        model.SelectedCustomerID,
        new SelectList(
            Model.Customers, 
            "CustomerID", 
            "Name", 
            Model.SelectedCustomerID
        ),
        new { id = "customerSelect" }
        );

    <script type="text/javascript">

        $(function () {
            $('#customerSelect').change(function () {
                this.form.submit();
            });
        })

    </script>

    <br /><br />

    for (int i = 0; i < Model.SalesOrders.Count(); i++)
    {
        @Html.DisplayFor(m => Model.SalesOrders[i].Reference) 
        @Html.CheckBoxFor(m =>
            m.SalesOrders[i].IsSelected
        )
        <br />
    }

}

Looks like Ryan is correct about ModelState.Clear(). 看起来Ryan关于ModelState.Clear()是正确的。 Here's an article explaining why it is necessary: 这是一篇解释为什么必要的文章:

http://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-object http://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-object

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

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