提交表单时保留模型属性

时间:2019-02-12 17:33:35

标签: c# asp.net-mvc

我试图弄清楚为什么返回带有模型的View时属性值不持久。

Index.cshtml

查看:

@Html.HiddenFor(model => model.IsWtv)

控制器:

[HttpPost]
public ActionResult Index([Bind(Exclude = "Id,ShippingCost")] TestModels model)
{
   //assume the initial value is false. I only want it to switch to true once
   if (!model.IsWtv)
      model.IsWtv = true;

   return View(model);
}

型号:

public Boolean IsWtv
{
   get;
   set;
}

当我重新提交表单时,IsWtv的值始终为false。我不明白为什么?

1 个答案:

答案 0 :(得分:1)

首先,在处理控制器操作方法时(除非这是某种类型的AJAX请求),您实际上应该遵循PRG模式(POST,重定向,GET)。

也就是说,class Program { static void Main(string[] args) { try { CustomRuleRepository repository = new CustomRuleRepository(); List<RuleEngineEntity> rules = new List<RuleEngineEntity>(); rules.Add(new RuleEngineEntity { FieldName = "Age", Name = "CustomerCheck", Value = 20 }); repository.LoadRules(rules); //Compile rules var factory = repository.Compile(); //Create a working session var session = factory.CreateSession(); RuleEngineRequestModel ruleEngineRequestModel = new RuleEngineRequestModel { ruleList = rules, customerData = new Customer { Name = "A", Age = 24 } }; session.Insert(ruleEngineRequestModel); var IspassedorNot = session.Fire(); } catch (Exception e) { Console.WriteLine(e.Message); } } } public class RuleEngineRequestModel { public List<RuleEngineEntity> ruleList { get; set; } public Customer customerData { get; set; } } public class RuleEngineEntity { public string Name { get; set; } public int Value { get; set; } public string Operator { get; set; } public string FieldName { get; set; } } public class Customer { public string Name { get; set; } public int Age { get; set; } } public class CustomRuleRepository : IRuleRepository { private readonly IRuleSet _ruleSet = new RuleSet("customerRule"); public IEnumerable<IRuleSet> GetRuleSets() { return new[] {_ruleSet}; } public void LoadRules(List<RuleEngineEntity> list) { _ruleSet.Add( BuildRule(list) ); } public List<IRuleDefinition> BuildRule(List<RuleEngineEntity> list) { NRules.RuleModel.Builders.RuleBuilder builder = null; List<IRuleDefinition> rulesList = new List<IRuleDefinition>(); builder = new NRules.RuleModel.Builders.RuleBuilder(); builder.Name("CustomerDetail"); ParameterExpression customerParameter = null; LambdaExpression customerCondition = null; PatternBuilder customerPattern = null; try { var orGroup = builder.LeftHandSide().Group(GroupType.Or); foreach (var item in list) { var andGroup = orGroup.Group(GroupType.And); customerPattern = andGroup.Pattern(typeof(RuleEngineRequestModel), item.Name); customerParameter = customerPattern.Declaration.ToParameterExpression(); customerCondition = Expression.Lambda( Expression.GreaterThan(CreateParameterExpression(typeof(RuleEngineRequestModel), "customerData", typeof(Customer), item.FieldName), Expression.Constant(item.Value)), customerParameter); customerPattern.Condition(customerCondition); } Expression<Action<IContext>> action = (ctx) => Console.WriteLine("Action triggered"); builder.RightHandSide().Action(action); rulesList.Add(builder.Build()); } catch (Exception e) { } return rulesList; } public Expression CreateParameterExpression(Type type, string propertyName, Type type2, string propertyName2) { ParameterExpression pe = Expression.Parameter(type, "e"); Expression left = Expression.Property(pe, type.GetProperty(propertyName)); return Expression.Property(left, type2.GetProperty(propertyName2)); } } 是从模型状态而不是模型中获取模型值的,而在更新并返回模型时。为了更新并返回模型,请在进行任何属性修改之前在您的post方法中添加以下代码行:

HtmlHelpers

或者您可以在ModelState本身中设置IsWtv的值:

ModelState.Clear();