Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 修改ViewModel后不工作的MVC4 HTML文本框_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 修改ViewModel后不工作的MVC4 HTML文本框

Asp.net mvc 修改ViewModel后不工作的MVC4 HTML文本框,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我有一个我真的不明白的问题。我有一个非常简单的模型,其中有一个作为公共成员的列表。每当我的控制器在回发时从模型中删除一个元素时,TextBoxFor()HTML帮助程序似乎不会接受这些更改。这些助手似乎正在缓存某些内容,但我无法确定 可在此处找到演示/复制: 复制 导航到 请注意,4列值中填充了基于零的值 点击“测试”按钮返回我删除列表中第一项的页面 请注意,“real”值是正确的,0元素已被删除,但是这里的问题是通过TextBoxFor()呈现的值。我无法理解为什么当0元素不再存在时,它仍呈现

我有一个我真的不明白的问题。我有一个非常简单的模型,其中有一个作为公共成员的列表。每当我的控制器在回发时从模型中删除一个元素时,TextBoxFor()HTML帮助程序似乎不会接受这些更改。这些助手似乎正在缓存某些内容,但我无法确定

可在此处找到演示/复制:

复制
  • 导航到
  • 请注意,4列值中填充了基于零的值
  • 点击“测试”按钮返回我删除列表中第一项的页面
  • 请注意,“real”值是正确的,0元素已被删除,但是这里的问题是通过TextBoxFor()呈现的值。我无法理解为什么当0元素不再存在时,它仍呈现0

  • 型号

    public class ItemViewModel
    {
        public string Description { get; set; }
        public decimal? Amount { get; set; }
    }
    
    public class TestViewModel
    {
        public TestViewModel()
        {
            Items = new List<ItemViewModel>();
        }
    
        public List<ItemViewModel> Items { get; set; }
    }
    
    公共类ItemViewModel
    {
    公共字符串说明{get;set;}
    公共小数?金额{get;set;}
    }
    公共类TestViewModel
    {
    公共TestViewModel()
    {
    项目=新列表();
    }
    公共列表项{get;set;}
    }
    
    控制器

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new TestViewModel();
    
            for (var i = 0; i < 4; i++)
            {
                model.Items.Add(new ItemViewModel { Description = i.ToString(), Amount = i });
            }
    
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(TestViewModel model)
        {
            model.Items.RemoveAt(0);
    
            return View(model);
        }
    
    }
    
    公共类HomeController:控制器
    {
    公共行动结果索引()
    {
    var模型=新的TestViewModel();
    对于(变量i=0;i<4;i++)
    {
    model.Items.Add(新的ItemViewModel{Description=i.ToString(),Amount=i});
    }
    返回视图(模型);
    }
    [HttpPost]
    公共行动结果索引(TestViewModel)
    {
    model.Items.RemoveAt(0);
    返回视图(模型);
    }
    }
    
    查看

    @model Demo.Models.TestViewModel
    @using (Html.BeginForm())
    {
        <table>
            <thead>
                <tr><td>Description</td><td>Amount</td><td>Real-Description</td><td>Real-Amount</td></tr>
            </thead>
            <tbody>
                @for (var i = 0; i < Model.Items.Count; i++)
                {
                    var ii = i;
                    <tr>
                        <td>@Html.TextBoxFor(m => m.Items[ii].Description)</td>
                        <td>@Html.TextBoxFor(m => m.Items[ii].Amount)</td>
                        <td>@Model.Items[ii].Description</td>
                        <td>@Model.Items[ii].Amount</td>
                    </tr>
                } 
            </tbody>
        </table>
        <button>Test</button>
    }
    
    @model Demo.Models.TestViewModel
    @使用(Html.BeginForm())
    {
    描述装入实际描述实际金额
    @对于(变量i=0;im.Items[ii].说明)
    @Html.TextBoxFor(m=>m.Items[ii].Amount)
    @模型.项目[ii].说明
    @模型.项目[ii].金额
    } 
    试验
    }
    
    根据所需的行为,按如下所示更改帖子索引方法:

        [HttpPost]
        public ActionResult Index(TestViewModel model)
        {
           ModelState.Clear();     
    
           model.Items.RemoveAt(0);
    
           return View(model);
        }
    
    原因如下:

    TextBoxFor绑定到ModelState中的后置值,而不是模型值。因此,在您的应用程序中,当您点击Test按钮时,文本框将绑定到它们已有的值,即使在更改模型值后,也不会在回发时更新。对于ex,如果第一行中的文本框显示0,并且即使在回发之后,它们仍将绑定到该值,并且基础模型的值为1。这种行为背后的原因是验证。如果您希望文本框中出现int,并且用户输入“SomeTextValue”,则模型绑定器将无法绑定到int属性,并且将处于验证错误状态。然后,您希望用户看到一个错误,该错误表示“SomeTextValue”不是整数。请输入一个整数,因为您希望用户输入的值在那里

    Rick Strahl在这篇博客文章中完美地解释了这一点

    和品牌威尔逊如下:


    谢谢,我相信这就是问题所在。我将测试并报告。