Asp.net mvc 如何在MVC中省略/防止数据发送到控制器中的POST方法

Asp.net mvc 如何在MVC中省略/防止数据发送到控制器中的POST方法,asp.net-mvc,model-view-controller,Asp.net Mvc,Model View Controller,我有一个使用模型的视图,我正在使用该信息创建表单。 我有三个步骤的形式是可选的或可能不会显示 问题是这些隐藏的部分与表单数据一起发布,破坏了业务逻辑。(我无法控制业务逻辑) 那么有没有办法告诉框架不要通过某些节或字段?也许是通过课堂或其他方式? 我知道我可以根据需要使用AJAX发送某些节,但站点规范要求根据需要隐藏和显示这些节。Show/Hide将不允许/不允许将值发送到控制器 被禁用或不可编辑的元素(99%的时间)将返回为null/minVal 您可以使用脚本中的JQuery将视图中的元素设置

我有一个使用模型的视图,我正在使用该信息创建表单。 我有三个步骤的形式是可选的或可能不会显示

问题是这些隐藏的部分与表单数据一起发布,破坏了业务逻辑。(我无法控制业务逻辑)

那么有没有办法告诉框架不要通过某些节或字段?也许是通过课堂或其他方式?


我知道我可以根据需要使用AJAX发送某些节,但站点规范要求根据需要隐藏和显示这些节。

Show/Hide将不允许/不允许将值发送到
控制器

被禁用或不可编辑的元素(99%的时间)将返回为
null
/
minVal

您可以使用脚本中的
JQuery
将视图中的元素设置为
Disabled

$('#elementID').attr("disabled", true);
或者您可以使用
DOM
命令:

document.getElementById('elementID').disabled = "true";
因此,您可以将字段同时设置为
禁用
隐藏
,使其既不显示也不填充。然后,在您的
控制器中
您可以根据某些字段(最好是必填字段,如果有的话)是否为空来确定业务逻辑


您可以在
C#
中这样检查: 对于
字符串

if (string.IsNullOrWhiteSpace(Model.stringField))
{
    ModelState.AddModelError("stringField", "This is an error.");
}
if (Model.dateTimeField == DateTime.MinValue)
{
    ModelState.AddModelError("dateTimeField ", "This is an error.");
}
对于
日期时间

if (string.IsNullOrWhiteSpace(Model.stringField))
{
    ModelState.AddModelError("stringField", "This is an error.");
}
if (Model.dateTimeField == DateTime.MinValue)
{
    ModelState.AddModelError("dateTimeField ", "This is an error.");
}

出于兴趣,以下是如何使用
JQuery
隐藏/显示视图中的元素:

$('#elementID').hide();
$('#elementID').show();

虽然您可以在客户端执行此操作,但它不会阻止恶意攻击

我建议你读书

摘录:

仅指定包含的属性:

[HttpPost]
public ViewResult Edit([Bind(Include = "FirstName")] User user)
{
  // ...
}
[HttpPost]
public ViewResult Edit([Bind(Exclude = "IsAdmin")] User user)
{
  // ...
}
仅指定排除的属性:

[HttpPost]
public ViewResult Edit([Bind(Include = "FirstName")] User user)
{
  // ...
}
[HttpPost]
public ViewResult Edit([Bind(Exclude = "IsAdmin")] User user)
{
  // ...
}
使用
TryUpdateModel()

使用接口

public interface IUserInputModel
{
  string FirstName { get; set; }
}

public class User : IUserInputModel
{
  public string FirstName { get; set; }
  public bool IsAdmin { get; set; }
}

[HttpPost]
public ViewResult Edit()
{
  var user = new User();
  TryUpdateModel<IUserInputModel>(user);
  // ...
}
最后,最推荐的方法是使用真实的ViewModel,而不是域模型:

public class UserInputViewModel
{
  public string FirstName { get; set; }
}

好的,所以没有办法说“不要发布整个部分”?除了必须将每个单独的项目设置为禁用之外?据我所知,POST方法中预期作为参数的模型将完全按照预先确定的方式接收。然而,每个字段是否包含数据不是预先确定的。