2012-03-07 84 views
0

我在我的应用程序中构建验证表单。在这种形式中有两个按钮。一个接受,一个拒绝。当用户按拒绝时,必须提供拒绝原因字段。我检查这个serverside。 我首先检查按下了哪个按钮,然后如果该字段为空,则向modelstate添加moddel错误。但是,因为表单中的所有字段都是只读的,所以这些字段不会发布回服务器,因此,当我将视图返回给用户时,没有数据。我可能错过了一些明显的东西,但无法找到该做什么。 (我知道我可以在我的形式各领域隐藏的,但由于大量的领域,这将是十分可怕的)asp.net mvc Serverside验证不返回数据

这是我的代码。

[HttpPost] 
    public virtual ActionResult Validate(string action, Record dto) { 

     if(action == Global.Accept) { 
      ciService.Store(dto); 
      return RedirectToAction("Index", "Ci"); 
     } else { 
      if(string.IsNullOrEmpty(dto.RejectionReason)) { 
       ModelState.AddModelError("RejectionReason", "REQUIRED!!!!"); 
       return View("Validate", dto); 


      } 
      ciService.Reject(dto); 
      return RedirectToAction("Index", "Ci"); 
     } 
    } 
+0

我可以建议做两个行动方法,一个接受和一个拒绝。名为Validate的动作似乎不适合做ciService.Store(dto); – labroo 2012-03-07 17:41:16

+0

'readonly'字段是什么意思?有'readonly'和'disabled'属性可以在你的输入标签上使用吗?这是你在说什么吗?请注意,虽然这两个属性都阻止用户修改这些字段中的值,但不同之处在于,只读输入字段仍将其值发布到服务器,而“禁用”字段则不是这种情况。 – 2012-03-07 17:42:00

+0

@DarinDimitrov我认为他意味着模型类上的字段是只读的。默认MVC模板然后只显示它们作为文本而不是HTML表单字段 – 2012-03-07 17:43:53

回答

2

您需要重新从数据库模型,然后进行更改以匹配任何改变被发布在dto。然后在视图中使用该组合模型。

+0

用户只能填写一个字段,所以这就是我所做的。谢谢 – Patrick 2012-03-07 20:21:53

0

您需要隐藏字段与UI中显示的每个属性相对应。

例如,

@ Html.LabelFor(M => m.MyProperty) - 对于展示

@ Html.Hiddenfor(M => m.MyProperty) - ToPostback值到服务器

0

如果我理解正确,问题是因为您不使用输入。 解决您的问题插入一些输入藏在你的形式与大家需要传递给控制器​​

@Html.HiddenFor(model => model.Myfield1) 
@Html.HiddenFor(model => model.Myfield2) 

应该固定值不是如果你不回传给你的行动

0

值需要服务器端的这些字段,只需创建一个新的ViewModel RecordValidateViewModel,并且这只包含需要验证的字段。模型联编程序将随后填充,您将只对该模型中的字段进行验证,而不是您在其中似乎并不需要的所有其他字段。

如果你需要他们来验证,然后张贴到服务器。它隐藏起来并不“丑陋”。

1

而不是从浏览器传递DTO背面的,我会用一个隐藏的HTML字段或含有标识DTO的ID的查询参数。那么你的POST操作方法看起来是这样的:

[HttpPost] 
public virtual ActionResult Validate(string action, int id) 
{ 
    // reload the DTO using the id 
    // now you have all the data, so just process as you did in your question 

    if (action == Global.Accept) { ... } 
    ... 
} 

你的GET方法可能看起来像那么下面...

[HttpGet] 
public virtual ActionResult Validate(int id) 
{ 
    // load the DTO and return it to the view 

    return View(); 
} 

这样,你有你所需要的中的数据你的POST动作方法可以做任何你需要的。