将数据从视图传递到控制器方法

时间:2015-12-15 16:47:30

标签: asp.net-mvc-4

我需要在控制器的方法中使用当前视图的名称 我可以在我的视图中使用下面的代码获取名称。

我想将此@ViewData [" pageName"]传递给我的MakeChange操作结果 在我的控制器中。我每次都通过MakeChange方法完成所有操作 是"对象引用未设置为对象的实例"

如何将视图中的数据传递给控制器​​方法?

            @ViewData["pageName"] =  @Path.GetFileName(Server.MapPath(VirtualPath))


             public ActionResult MakeChange(string lang)
                    {
                        string getPageName = ViewData["pageName"].ToString();

                        return RedirectToAction(getPageName, "Home");
                    }

2 个答案:

答案 0 :(得分:0)

您无法使用ViewData将数据从视图传递到控制器。您可以使用ViewData将数据从Controller传递到视图。

要实现您的目标,您可以按照以下方式执行:

{{1}}

Ps:你应该把输入放在表格标签里。

答案 1 :(得分:0)

Path.GetFileName(Server.MapPath(VirtualPath))会为您提供带扩展名的剃须刀视图名称(例如:index.cshtml)。您不能将此用于RedirectToAction方法,因为RedirectToAction方法正在查找操作方法名称。在使用之前,您需要减少文件扩展名部分。

要将此值发送到控制器操作,您可以将值保留在表单内的隐藏字段中。当用户发布表单时,它将在您的HttpPost操作方法中可用。您需要确保存在一个与隐藏字段名称值同名的参数。

@using (Html.BeginForm())
{
   <input type="text" name="lang" value="English" />
   <input type="hidden" name="pageName" 
                                 value="@Path.GetFileName(Server.MapPath(VirtualPath))" />

   <input id="BtnAdd" type="submit" value="Save" />

}

所以你的行动方法将是

public ActionResult MakeChange(string lang,string pageName)
{
   var viewName=pageName;
   //Get rid of the extension.
   viewName = viewName.Replace(".cshtml","");
   return RedirectToAction(viewName , "Home");
}

即使你正在做一个ajax帖子,它仍然有用,只需序列化你的表单并发送它

$("#BtnAdd").click(function(e){
   e.preventDefault();
   var _this = $(this); 
   $.post("@Url.Action("MakeChange","Home")",_this.closest("form").serialize(),
                                                                       function(response){

        //do something with response
    });
});

有更多干净的方法来获取视图名称而没有我们所做的文件扩展名修剪方法。看看this answer