簡體   English   中英

在執行表單操作后將參數傳遞回視圖嗎?

[英]Passing a parameter back to a view after performing a form action?

我有一個視圖,它加載具有特定記錄號的記錄。 頁面加載后,將為用戶提供登錄其他信息的機會。 一旦執行了登錄邏輯,我需要返回具有相同記錄編號的相同視圖。 我正在使用表單中的隱藏輸入將記錄號傳遞給操作。 我似乎無法弄清楚的是如何返回相同的視圖並為其提供記錄#。 我在下面嘗試的代碼無法正常工作。 我知道這是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 } );
    }

編輯:

事實證明,將返回正確的視圖,但是根據下面的Index操作結果,期望模型項類型為“ 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);
    }

編輯:

感謝Reddy,您的建議有效! 我唯一剩下的問題是,當我從Authenticate操作返回到索引視圖時,我似乎沒有“ jdata”。 通過身份驗證操作返回索引視圖時,是否不會重新運行我的索引操作結果? 我來自Web表單背景,在這樣的實例中,加載表單時,Load / Init事件將自動運行。 我是否需要在Authenticate操作中綁定“ jdata”並將其包含在viewmodel中?

編輯:已解決。 將我的“返回視圖”更改為“返回RedirectToAction”以解決我的最后一個問題。 感謝大家!

您最好像這樣創建一個ViewModel:

創建一個視圖模型類,即

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輸出

確實值得做一些教程來學習這些約定,為此花費少量時間將為您節省很多時間。

對於您的修改后答案:

您只想傳遞一個int Id ,您的List<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 );
    }

現在確保您的視圖設置為期望使用新的視圖模型

@model JObSummaryModelHelper 

繼續進行操作...

代替

return View("Index",  new { id = myid } );

你能做

return Index(myid);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM