Как передать скрытые значения из view1 в view2 по нажатию кнопки - PullRequest
0 голосов
/ 22 марта 2019

У меня два взгляда.У меня есть текстовые поля для ввода основных деталей.как только клиент вводит базовые данные и щелкает, чтобы добавить больше деталей, мне нужно передать детали, введенные в 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 ]

1 голос
/ 22 марта 2019

Хорошо, несколько вещей не так на этом.Во-первых, удалите скрытые поля в view1, они вам не нужны, поскольку они есть в ваших @Html.TextBoxFor элементах управления.

Во-вторых, когда вы отправляете форму view1 на контроллер, который нужно получитьview1 ViewModel и передать значения в View2 ViewModel

Поэтому нам нужен еще один метод в вашем контроллере для обработки события POST, которое происходит, когда вы нажимаете submit на View1 и принимает значения форм...

[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
}

РЕДАКТИРОВАТЬ: Забыл о AntiforgeryToken в способе записи!

0 голосов
/ 22 марта 2019

В MVC представления и контроллеры тесно связаны таким образом, что при правильном проектировании приложения MVC представления напрямую не взаимодействуют с классами модели или с другими представлениями: они имеют дело только с контроллерами.

Это означает, что ваш 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, где вы обновляете хранилище, используя DetailsData из формы View2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...