执行表单操作后将参数传递回视图?

时间:2014-02-04 20:05:18

标签: c# asp.net asp.net-mvc asp.net-mvc-4 visual-studio-2012

我有一个加载具有特定记录号的记录的视图。加载页面后,它为用户提供了登录其他信息的机会。一旦执行登录逻辑,我需要返回具有相同记录号的相同视图。我正在使用表单中的隐藏输入将记录号传递给操作。我似乎无法弄清楚的是如何返回到同一个视图并提供该记录#。我在下面尝试的代码不起作用。我知道这是MVC 101的东西,但是在正确的方向上的暗示会受到赞赏,或者随意废弃我的方法并提出更好的建议!

视野中的表格:

 <form action="/MyView/Authenticate/@item.ID" method="post" enctype="multipart/form-data">
      <input name="form_id" type="hidden" value="@item.ID">
      .....

表格行动:

    [HttpPost]
    public ActionResult Authenticate()
    {
        int myid = Convert.ToInt16(Request["form_id"]);
        .....
        return View("Index",  new { id = myid } );
    }

编辑:

事实证明正在返回正确的视图,但是根据下面的索引操作结果,它期望模型项类型为“JobSummaryModel”。所以我真正需要回答的问题是,如何将记录ID和此视图模型传递给它?

    public ActionResult Index(int id = 0)
    {
        List<JobSummaryModel> jdata;

        ViewBag.IsResults = false;

        if (id != 0)
        {
            ViewBag.IsResults = true;            
        }
        jdata = db.Jobs.Where(c => c.ID == id).Select(c => new JobSummaryModel() { ID = c.ID, Name = c.Name, City = c.City, PostalCode = c.PostalCode, JobDescription = c.PositionDescription }).ToList();
        return View(jdata);
    }

编辑:

谢谢雷迪,你的建议奏效了!我唯一剩下的问题是,当我从Authenticate操作返回我的索引视图时,我似乎没有我的“jdata”。通过我的Authenticate操作返回索引视图时,我的索引操作结果是否未重新运行?我来自Web表单背景,在这样的实例中,Load / Init事件将在加载表单时自动运行。我是否需要在Authenticate操作中绑定我的“jdata”并将其包含在viewmodel中?

编辑:已解决。将我的“返回视图”更改为“返回RedirectToAction”以解决我的最终问题。谢谢大家!

3 个答案:

答案 0 :(得分:1)

最好为此创建一个ViewModel:

创建一个View Model类,即

public class AuthViewModel
{
    public int MyId { get; set; }
}

在您的视图中,将以下指令放在顶部:

@model AuthViewModel

在您的初始[HttpGet]方法中,返回视图模型:

[HttpGet]
public ActionResult Authenticate()
{
    var model = new AuthViewModel { MyId = 123 };
    return View("Index", model );
}

最好在视图中使用Html助手,以便将其更改为:

@using(Html.BeginForm()
{
    @Html.HiddenFor(m => m.MyId)
    ...
}

以上使用命名约定来回发您所处的操作。

然后将其返回到您的视图:

[HttpPost]
public ActionResult Authenticate(AuthViewModel model)
{
    int myid = model.MyId;
    return View("Index", model );
}

然后您可以使用此剃刀语法@Model.MyId

输出

真的值得做一些教程来学习惯例,投入少量时间将为您节省大量时间。

答案 1 :(得分:1)

回答你的后编辑:

您要传递给查看的所有内容是int IdList<JobSummaryModel> jdata对吗?

所以创建一个ViewModel JObSummaryModelHelper

Public class JObSummaryModelHelper
{
   public int Id {get;set;}
   public List<JobSummaryModel> jdata {get;set;}
}

现在在您的控制器中

public ActionResult Index(int id = 0)
    {
        JObSummaryModelHelper jobDetails = new JObSummaryModelHelper();
        jobDetails.Id = id;           

        ViewBag.IsResults = false;

        if (id != 0)
        {
            ViewBag.IsResults = true;            
        }
        jobDetails .jdata = db.Jobs.Where(c => c.ID == id).Select(c => new JobSummaryModel() { ID = c.ID, Name = c.Name, City = c.City, PostalCode = c.PostalCode, JobDescription = c.PositionDescription }).ToList();
        return View(jobDetails );
    }

现在确保您的视图设置为期望这个新的viewmodel

@model JObSummaryModelHelper 

继续你的操纵......

答案 2 :(得分:0)

而不是

return View("Index",  new { id = myid } );
你能做到吗

return Index(myid);