我整个下午都试图在网上爬行,试图在动作控制器中接收一个JSON对象.
这样做的正确和/或更简单的方法是什么?
我尝试过以下方法:1:
//Post/ Roles/AddUser
[HttpPost]
public ActionResult AddUser(String model)
{
if(model != null)
{
return Json("Success");
}else
{
return Json("An Error Has occoured");
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我输入的空值.
2:
//Post/ Roles/AddUser
[HttpPost]
public ActionResult AddUser(IDictionary<string, object> model)
{
if(model != null)
{
return Json("Success");
}else
{
return Json("An Error Has occoured");
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我jquery方面的500错误,试图发布到它?(意思是它没有正确绑定).
这是我的jQuery代码:
<script>
function submitForm() {
var usersRoles = new Array;
jQuery("#dualSelectRoles2 option").each(function () {
usersRoles.push(jQuery(this).val());
});
console.log(usersRoles);
jQuery.ajax({
type: "POST",
url: "@Url.Action("AddUser")",
contentType: "application/json; charset=utf-8",
dataType: "json", …Run Code Online (Sandbox Code Playgroud) 谁能告诉我为什么要使用NonAction?我的意思是说我有一个包含多个提交值的表单:Update,Delete或Insert.由于所有提交按钮具有相同的共同形式,因此我在控制器内切换提交值并采取相应措施.
像这样:
public ActionResult asd(string submitButton){
switch(submitButton){
case "Insert":
return Insert();
// bla bla bla
}
}
[NonAction]
public ActionResult Insert(){
// some code inside here
return View();
}
Run Code Online (Sandbox Code Playgroud)
再一次,为什么我应该使用NonAction而不是这样的东西:
public void Insert(){
// some code inside here
}
Run Code Online (Sandbox Code Playgroud) ASP.NET MVC控制器操作方法主要用于处理"业务"操作,但它可以用于更多.
我认为看到人们创造的创造性,有用的东西对他人来说可能是实用的或有用的,这会很有趣.
这是我的贡献:
Javascript文件连接器 - 减少http请求的数量:
[OutputCache(Duration = 5 * 60, VaryByParam="")] // DONT USE "None" here *
public ContentResult RenderJavascript(){
StringBuilder js = new StringBuilder();
StringWriter sw = new StringWriter(js);
// load all my javascript files
js.AppendLine(File.ReadAllText(Request.MapPath("~/Scripts/jquery.hoverIntent.minified.js")));
js.AppendLine(File.ReadAllText(Request.MapPath("~/Scripts/jquery.corner.js")));
js.AppendLine(File.ReadAllText(Request.MapPath("~/Scripts/rollingrazor.js")));
return new ContentResult()
{
Content = js.ToString(),
ContentType = "application/x-javascript"
};
}
Run Code Online (Sandbox Code Playgroud)
映射到它的路线:
// javascript
routes.MapRoute(
"js-route",
"dynamic/js",
new { controller = "Application", action = "RenderJavascript" }
);
Run Code Online (Sandbox Code Playgroud)
请从您的母版页中查看:
<script type="text/javascript" src="/dynamic/js"></script>
Run Code Online (Sandbox Code Playgroud)
请注意,我已为输出设置了缓存,因此如果您要更改JS并刷新页面,则可能需要禁用缓存!
我需要回来找出如何gzip它.
*您不应该使用VaryByParam ="None",因为这会导致发送Vary标头,这会导致浏览器返回并检查新版本.如果你真的需要更改你的js内容,那么你的用户只需要等待5分钟!
我正在研究我的第一个真正的ASP.NET MVC项目,我注意到我一直在工作的控制器变得相当大.这似乎违背了保持控制器薄的最佳做法.
我已经做好了将业务逻辑从控制器中删除的工作.我为此使用了一个单独的层.每个操作主要调用业务层中的方法,并根据模型状态是否有效来协调最终结果.
也就是说,控制器有很多动作方法.直觉上,我想将控制器分解为子控制器,但我没有看到一个简单的方法.我可以简单地将控制器分解为单独的控制器,但是我松开了层次结构,感觉有点脏.
是否有必要使用大量精简操作重构控制器?如果是这样,最好的方法是什么?
我正在寻找一种方法来强制执行控制器的操作只能通过AJAX请求访问.
在调用action方法之前执行此操作的最佳方法是什么?我想从我的动作方法重构以下内容:
if(Request.IsAjaxRequest())
// Do something
else
// return an error of some sort
Run Code Online (Sandbox Code Playgroud)
我想象的是ActionMethodSelectorAttribute可以像[AcceptVerbs]属性一样使用.我没有经验包装这样的自定义属性.
使用ASP.net MVC是否可以将表单POST到控制器操作,该操作包括不在表单中的参数,但是来自URL?
例如
GroupController中的Action方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int idOne, int idTwo, Model model)
{ ... }
Run Code Online (Sandbox Code Playgroud)
路线:
"{controller}/{action}/{idOne}/{idTwo}"
Run Code Online (Sandbox Code Playgroud)
发布网址:
/Employee/Show/1/42
Run Code Online (Sandbox Code Playgroud)
在此示例中,表单将发布到不同的控制器,模型具有正确的值,但其他参数的默认值为0.
我期望的行为是ModelBinder会看到我有两个匹配给定路由的参数,并以与GET操作相同的方式将当前值1和42分配给参数.
这种行为不受支持,或者我错过了什么?
编辑:要清楚,Show控制器视图上的Employee表单包含一个发布到不同控制器的表单.我们可以称之为Group.
表单操作URL如下所示
/Groups/Create/0/0
Run Code Online (Sandbox Code Playgroud)
表格声明如下
Html.BeginForm("Create", "Groups")
Run Code Online (Sandbox Code Playgroud)
尝试了许多不同的重载后,Html.BeginForm我发现仅当表单操作URL与浏览器地址栏中的当前URL匹配时才会映射参数.
因此,如果我导航到URL,/Groups/Create/1/42我将有一个新表格.如果我然后提交表单,则URL路由值将传递给POST操作.
我的控制器中有一个方法,我不想从浏览器的地址栏中调用...
有没有办法做到这一点?也许某种注释,路由配置中的修改?我有哪些选择?
我想采用现有的action方法,将其返回值呈现给字符串并将其作为JSON发送给AJAX请求的响应.
为此,我需要将ActionResult渲染为字符串.我该怎么做呢?
我们可以使用this.Content()将字符串转换为ActionResult.
更新
现有和第一个操作方法返回一个ActionResult类型,但它确实返回一个ViewResult来响应HTTP post请求.我有第二个动作方法(我的外观),它返回一个响应AJAX请求的JsonResult.我希望第二个动作方法使用第一个动作方法来呈现HTML.
在宏观方案中,我想要一个ActionResult(从一个动作方法生成),不仅可以通过标准的HTTP帖子检索,还可以通过Facade动作方法(第二个动作方法)通过AJAX请求检索.这样,作为开发人员,我可以选择使用HTTP Post或AJAX来检索页面的呈现.
对不起,我试图让这个更新尽可能短.谢谢.
有没有办法通过使用 params 关键字将多个参数传递给带有 GET 的操作方法,如下所示?
http://.../Method/param1/param2/param3/..../paramN
Run Code Online (Sandbox Code Playgroud)
动作方法应如下:
public ActionResult Method(params string[] parameters)
{
//Do what ever.
}
Run Code Online (Sandbox Code Playgroud) actionmethod ×10
asp.net-mvc ×9
c# ×4
json ×2
.net ×1
actionresult ×1
ajax ×1
asp.net ×1
controller ×1
modelbinders ×1
parameters ×1
return-type ×1
string ×1