Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
如何从视图将c#对象发布到动作?_C#_Asp.net Mvc_Jquery - Fatal编程技术网

如何从视图将c#对象发布到动作?

如何从视图将c#对象发布到动作?,c#,asp.net-mvc,jquery,C#,Asp.net Mvc,Jquery,我有一个视图,它是通过调用一个动作来呈现的,我正在向它传递一个视图模型,例如Vm1,然后填充一些下拉列表 在这个视图中,我有一个带有一些文本框的“过滤器”部分和一个“过滤器”按钮,我想调用另一个操作,传递文本框的值,然后在div中的页面上部分呈现第二个视图 我已经这样做了,我的操作如下所示,当单击“过滤器”按钮时,ajax会调用该操作: ActionResult ActionName (string inputText1, string inputText2, string inputText3

我有一个视图,它是通过调用一个动作来呈现的,我正在向它传递一个视图模型,例如Vm1,然后填充一些下拉列表

在这个视图中,我有一个带有一些文本框的“过滤器”部分和一个“过滤器”按钮,我想调用另一个操作,传递文本框的值,然后在div中的页面上部分呈现第二个视图

我已经这样做了,我的操作如下所示,当单击“过滤器”按钮时,ajax会调用该操作:

ActionResult ActionName (string inputText1, string inputText2, string inputText3, ...)
因为我有大约10个文本框,所以我想创建一个新的c#对象,并将该对象传递给此操作,使其看起来更简单:

ActionResult ActionName(MyActionFilters myFilters)

如何实现这一点?

您需要将表单输入名称设置为ViewModel的属性,然后MVC将执行一些神奇的操作,例如:

public class FormViewModel {
    public string input1 {get;set;}
    public string input2 {get;set;}
    // and so on
}
<input type="text" name="MyActionFilters.YOUR_PROPERTY_NAME" />
然后,关于你的行动:

public ActionResult FormPost(FormViewModel model) {
    // you'll have access to model.input1, model.input2, etc
}
最后,例如,您要在HTML表单上创建:

<input type="text" name="input1" />
<input type="text" name="input2" />


或者您可以使用
Html.TextBoxFor(model=>model.Input1)
,助手将正确命名所有内容。

输入标记的name属性应以对象名称(“MyActionFilters”)作为前缀

例如:

public class FormViewModel {
    public string input1 {get;set;}
    public string input2 {get;set;}
    // and so on
}
<input type="text" name="MyActionFilters.YOUR_PROPERTY_NAME" />

顺便说一句,您的操作方法应该使用HttpPost属性进行注释

[HttpPost]
ActionResult ActionName(MyActionFilters myFilters)

您可以拥有如下模型

public class MyActionFilters
{
  public string Property1{get;set;}
  public string Property2{get;set;} 
  public string[] Property3{get;set;} 

  // add any number of properties....
}
您可以在Get操作方法中传递空模型

ActionResult ActionName()
{
  MyActionFilters myEmptyActionFilers= new MyActionFilters();
  View(myEmptyActionFilers)
}
在形式上

Html.TextBoxFor(model => model.Property1)
Html.TextBoxFor(model => model.Property2)
然后在post方法中,您可以访问表单中填充的模型 我已经删除了以前的代码。新代码位于编辑标记之后:)

编辑: 对不起,我不在。使用AJAX可以轻松实现此类功能:)

如下所示

[HttpPost]
PartialViewResult ActionName(MyActionFilters myActionFilers)// this is magic
{
  /*you can access the properties here like myActionFilers.Property1 and pass the 
    same object after any manipulation. Or if you decided have a model which contains 
    a variable to hold the search results as well. That is good.*/

   return PartialView(myActionFilers);
}
到目前为止,这是一个很好的例子

不要忘了在视图中添加
jquery.unobtrusiveajax.js
脚本引用。如果没有,Ajax将不会影响。在给定的示例中,正如您所看到的,他已经在_布局中完成了这项工作


PS:明智地选择要传递给视图的模型的属性,享受Ajax

谢谢。我不想更改页面,这些可能是PartialView并加载到页面上的div中吗?因此,我应该创建一个单独的部分视图,其中包含搜索筛选器和搜索结果,或者每个都有一个部分视图?搜索筛选器将始终存在,搜索结果将作为部分视图加载到。查看我对答案的更新。HttpPost能否返回部分视图?阿贾克斯会发帖子吗?当然!您可以使用JQuery:$.ajax({type:“post”,url:url,data:data,success:function(data){$('#someelement').html(data);},dataType:dataType});并返回一个HTML视图,该视图将添加到您的页面上。要执行post请求,请检查以下内容: