单击按钮时如何将隐藏值从view1传递到view2

时间:2019-03-22 15:28:44

标签: c# asp.net-mvc

我有两种看法。我认为1有文本框可输入基本详细信息。客户输入基本详细信息并单击添加更多详细信息后,我需要将在view1中输入的详细信息传递给view2文本框。我使用隐藏的方式穿越。但是它并没有传递到下一个观点。请提出任何建议。

View1控制器:

    public ActionResult View1()
    {
        return View();
    }

 [HttpPsot]
 public ActionResult View2()
    {
        return ProcessAction();
    }

View2控制器:

    public ActionResult View2()
    {
        return View();
    }

View1:

    <script>
        $(document).ready(function() {
            $("#add").click(function() {View2", "Application")";
            });
        });
    </script>
@using (Html.BeginForm("View1", "Application", FormMethod.Post)) 
{
    @Html.AntiForgeryToken()
     @Html.HiddenFor(model => model.LastName)
     @Html.HiddenFor(model => model.FirstName)
     @Html.HiddenFor(model => model.Email)
    <div class="col aligncenter">          
        <div class="form-row topMargin">               
            <div class="col-md-6 form-group">
                @Html.TextBoxFor(model => model.Email)                    
            </div>
            <div class="col-md-4 form-group">
                @Html.TextBoxFor(model => model.FirsttName)                    
            </div>
            <div class="col-md-2 form-group">
                @Html.TextBoxFor(model => model.LastName)
             </div>
        </div>
        <div class="form-row">
            <div class="col-md-9 form-group text-right">
                <button class="btn" type="button" id="add" name="add" value="add">Add</button>
            </div>
            <div class="col-md-3 form-group text-right">
                <button class="btn" type="submit" name=new" value="new">view old</button>
            </div>
        </div>
    </div>
}

View2:

@using (Html.BeginForm("View2", "Application", FormMethod.Post)) 
{
    @Html.AntiForgeryToken()
    <div class="col aligncenter">          
        <div class="form-row topMargin">               
            <div class="col-md-6 form-group">
                @Html.TextBoxFor(model => model.Email)                    
            </div>
            <div class="col-md-4 form-group">
                @Html.TextBoxFor(model => model.FirsttName)                    
            </div>
            <div class="col-md-2 form-group">
                @Html.TextBoxFor(model => model.LastName)
             </div>
<div class="col-md-2 form-group">
                @Html.TextBoxFor(model => model.address)
             </div>
<div class="col-md-2 form-group">
                @Html.TextBoxFor(model => model.state)
             </div>
<div class="col-md-2 form-group">
                @Html.TextBoxFor(model => model.zip)
             </div>
        </div>
        <div class="form-row">
            <div class="col-md-9 form-group text-right">
                <button class="btn" type="submit" value="osubmit">submit</button>
            </div>
            
        </div>
    </div>
}

2 个答案:

答案 0 :(得分:1)

好吧,这是错误的。首先,删除view1上的隐藏字段,因为您将它们放在@Html.TextBoxFor控件中,所以不需要它们。

第二,当您将view1的形式发布到控制器时,它需要接收view1的ViewModel,并将值传递给View2的ViewModel

因此,我们需要您的控制器中的另一种方法来处理POST事件,该事件在您单击View1上的Submit并采用您的表单值时发生...

[ValidateAntiforgeryToken]
[HttpPost]
public ActionResult View1(View1ViewModel model)
{
    if (ModelState.Isvalid)//check if valid
    {
        var newModel = new View2ViewModel()
        {
            Email = model.Email,
            LastName = model.LastName,
            FirstName = model.FirstName
        };
        return View("~/The path of view 2", newModel);//go to view 2
    }

    return View(model);//return the first view if it's not valid
}

编辑:忘记了post方法上的AntiforgeryToken

答案 1 :(得分:0)

在MVC中,视图和控制器紧密结合在一起,当您正确设计MVC应用程序时,视图不会直接与Model类或其他视图通信:它们仅处理控制器。

这意味着您的View1必须将其数据发送回控制器,该控制器的工作将是获取这些数据,执行验证逻辑,修改模型(如果需要),然后使用获得的已处理数据调用View2。从View1。怎么发生的?

首先,您将需要几个ViewModel来包装所需的所有数据

public class MainViewModel
{
    public string MainData;
}

public class DetailsViewModel
{
    public string DetailsData;
}

然后我们有了控制器。假设您有一个具有简单View1方法的控制器:

public View1()
{
    return View()
}

这将调用您的View1,其中显示模型的空白字段

@MyApp.Models.ViewModel

@using(Html.BeginForm(“View1”))
{
    @Html.EditorFor(m => m.MainData)
    // submit 
}

这将导致对控制器中的POST方法的View1调用。由于具有过滤器属性,您可以在同一控制器中指定第二个View1方法,该方法的工作将处理从View1发送的数据并将用户重定向到View2

[HttpPost]
public RedirectToRouteResult View1(ViewModel model)
{
    repository.Set(model.MainData);
    return RedirectToAction(“View2”);
}

现在,只需在View2中重复调用HttpPost方法,即可使用来自View2表单的DetailsData更新存储库