Как переместить данные из одного действия в другое действие в том же контроллере для форм?

Как переместить данные из результата Iaction в результат другого действия? Я пытался отобразить данные из формы и просмотреть еще один Iactionresult? Я пытаюсь использовать Tempdata, но, похоже, произошла ошибка. Может ли кто-нибудь помочь мне с этим?

Это действие отображает детали отдельного продукта, когда я нажимаю на определенный идентификатор.

  [HttpGet]
  public IActionResult Details(int id)
  {
     string sql = String.Format(@"SELECT * FROM WBProduct 
                                   WHERE Id = {0}", id);
     List<Product> lstProduct = DBUtl.GetList<Product>(sql);
     if (lstProduct.Count == 0)
     {
        TempData["Message"] = $"Product #{id} not found";
        TempData["MsgType"] = "warning";
        return RedirectToAction("Index");
     }
     else
     {
        
        Product cdd = lstProduct[0];

        return View(cdd);
     }

        

  }

Я хотел бы отобразить детали продукта в этом IActionResult

[HttpPost]
public IActionResult Create()
{
     return View("Create");
}

Подробнее:

@model Product

<div>

    <div class="form-group row">
        <div class="offset-sm-2"><h2>@Model.ProductName</h2></div>
    </div>

    <div class="form-group row">
        <div class="offset-sm-2 col-sm-5">
            <img id="ImgPhoto" src="~/images/product/@Model.ProductImage" style="width:400px;" />
        </div>
    </div>

    <div class="form-group row">
        <label class="control-label col-sm-2" for="City">Weight: </label>
        <div class="col-sm-5">
            <input type="text" asp-for="ProductWeight" class="form-control" readonly />
        </div>
    </div>

    <div class="form-group row">
        <label class="control-label col-sm-2" for="Date">Stock :</label>
        <div class="col-sm-5">
            <input type="text" asp-for="ProductStock" class="form-control" readonly />
        </div>
    </div>



    <div class="form-group row">
        <label class="control-label col-sm-2" for="Cost">Price: </label>
        <div class="col-sm-5">
            <input type="text" asp-for="ProductPrice" asp-format="{0:C}" class="form-control" readonly />
        </div>
    </div>

    <div class="form-group row">
        <label class="control-label col-sm-2" for="Story">Description: </label>
        <div class="col-sm-5">
            <textarea asp-for="ProductDescription" rows="8" cols="20" class="form-control" readonly></textarea>
        </div>
    </div>

   
    

    <div class="form-group row">
        <a href="http://localhost:50528/Product/Create" class="btn btn-info" role="button" > Add to Cart </a>
    </div>

    </div>

Создать вид:

@model Product
<div class="form-group row">
    <div class="offset-sm-2"><h2>@Model.ProductName</h2></div>
</div>



<div class="form-group row">
    <label class="control-label col-sm-2" for="City">Weight: </label>
    <div class="col-sm-5">
        <input type="text" asp-for="ProductWeight" class="form-control" readonly />
    </div>
</div>

<div class="form-group row">
    <label class="control-label col-sm-2" for="Date">Stock :</label>
    <div class="col-sm-5">
        <input type="text" asp-for="ProductStock" class="form-control" readonly />
    </div>
</div>



<div class="form-group row">
    <label class="control-label col-sm-2" for="Cost">Price: </label>
    <div class="col-sm-5">
        <input type="text" asp-for="ProductPrice" asp-format="{0:C}" class="form-control" readonly />
    </div>
</div>

<div class="form-group row">
    <label class="control-label col-sm-2" for="Story">Description: </label>
    <div class="col-sm-5">
        <textarea asp-for="ProductDescription" rows="8" cols="20" class="form-control" readonly></textarea>
    </div>
</div>

Я получил сообщение об ошибке: введите здесь описание изображения


person iwanttopassmyfyp    schedule 09.01.2021    source источник
comment
TempData[Product] = lstProduct[0];   -  person Steve    schedule 09.01.2021
comment
@ Стив, это не работает. Он не отображал отдельные детали продукта, поэтому данные не переносятся в представление.   -  person iwanttopassmyfyp    schedule 09.01.2021
comment
Можете ли вы показать код действия? По крайней мере, какая-то соответствующая часть, где вы читаете и используете TempData?   -  person Steve    schedule 09.01.2021
comment
Я вставил вид для деталей   -  person iwanttopassmyfyp    schedule 09.01.2021
comment
Ждать. Вы пытаетесь перенаправить на действие POST? Если я не ошибаюсь, это невозможно. Вы должны перенаправить на действие GET   -  person Steve    schedule 09.01.2021
comment
да. Я просто хотел бы передать данные из результата действия в другой результат действия. Итак, как мне это сделать? Поэтому я хотел бы передать данные из Details в Create.   -  person iwanttopassmyfyp    schedule 09.01.2021
comment
Не понимаю, зачем тебе идти творить. Не могли бы вы показать свое представление «Создать», пожалуйста?   -  person Serge    schedule 10.01.2021
comment
Или покажите в своем коде, куда вы хотите перенаправить на Create.   -  person Serge    schedule 10.01.2021
comment
Да, я хотел бы также передать данные в Create View, но это в другом действии. Как мне это сделать? Я следовал вашему методу, но это приводит к тому сообщению об ошибке, которое я вставил выше. @Сергей   -  person iwanttopassmyfyp    schedule 10.01.2021
comment
‹div class=form-group row› ‹a href=localhost:50528/Product/Create class= btn btn-info role=button › Добавить в корзину ‹/a› ‹/div› Этот код перенаправляет в окно создания. @Сергей   -  person iwanttopassmyfyp    schedule 10.01.2021


Ответы (2)


Это должно быть действие GET, а не POST, тогда вы должны извлечь информацию из TempData и передать ее в качестве параметра представлению cshtml.

 TempData["Product"] = JsonConvert.SerializeObject(lstProduct[0]);
 return RedirectToAction("Create");

Теперь вы можете десериализовать действие «Создать» и получить свой продукт.

[HttpGet]
public IActionResult Create()
{
     // If the caller has prepared a product we can show it.
     if(TempData.ContainsKey("Product"))
     {
         Product p = JsonConvert.DeserializeObject<Product>(TempData["Product"]);
         return View(p);
     }
     else
         return View();
}
person Steve    schedule 09.01.2021
comment
Я отредактировал коды, так как они могут отображать продукты только тогда, когда я включаю '{ Product cdd = lstProduct[0]; вернуть вид (кдд); }' Как включить TempData? - person iwanttopassmyfyp; 09.01.2021
comment
Также лучший пример с повторно используемым кодом можно найти здесь stackoverflow. ком/вопросы/34638823/ - person Steve; 09.01.2021

Если вы хотите переместить данные из одного действия в другое действие в том же контроллере, просто вызовите одно действие из другого и поместите данные в качестве входного параметра другого действия.

Чтобы отправить сообщение действию Index, сначала создайте класс для сообщения:

public class ErrorMsg
{
 public string Message {get; set;}
 public string MessageType {get; set;}
}

Измените свой индекс действия на это:

public IActionResult Index(ErrorMsg errorMsg)
  {
// if action called from another controller action, details for exapmple,
//errorMsg will contain data from that action
// otherwise errMsg will be an empty default object with empty strings

 //Check if error
if(!string.IsNullOrEmpty(errorMsg.Message) ...your error code
  else       ....your index code here
}

Измените код сведений о действии:

  public IActionResult Details(int id)
  {
     string sql = String.Format(@"SELECT * FROM WBProduct 
                                   WHERE Id = {0}", id);
     List<Product> lstProduct = DBUtl.GetList<Product>(sql);

     if (lstProduct.Count == 0)
     {
        var errMsg = new ErrMessage { 
        Message = $"Product #{id} not found",
        MessageType = "warning"
         }

        return Index(errMsg);
     }
     else
     {
       
       Product cdd= lstProduct.FirstOrDefault();
       //Or you can try again  var  cdd = lstProduct[0]; if you like it more

        return View("Details", cdd);
     }
  }

Измените действие создания на это:


public IActionResult Create(Product product)
{

// if action called from another controller action, "product" will contain data //from that action
// otherwise "product" will be posted from the view or it will be an empty model with the default value fields

 if(product.Id ==0)  ... call add ef code 
    else ... call update ef code
}

И вам нужно добавить тег ‹form ко всем вашим представлениям, в противном случае, если не будут отправляться какие-либо данные, и добавить скрытое поле Product.Id внутри формы:

@model Product

@using (Html.BeginForm("Create", "Product", FormMethod.Post)
{
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

<div>

<input type="hidden" asp-for="@Model.Id" />

    <div class="form-group row">
        <div class="offset-sm-2"><h2>@Model.ProductName</h2></div>
    </div>

    <div class="form-group row">
        <div class="offset-sm-2 col-sm-5">
            <img id="ImgPhoto" src="~/images/product/@Model.ProductImage" style="width:400px;" />
        </div>
    </div>

    <div class="form-group row">
        <label class="control-label col-sm-2" for="City">Weight: </label>
        <div class="col-sm-5">
            <input type="text" asp-for="ProductWeight" class="form-control" readonly />
        </div>
    </div>

    <div class="form-group row">
        <label class="control-label col-sm-2" for="ProductStock">Stock :</label>
        <div class="col-sm-5">
            <input type="text" asp-for="ProductStock" class="form-control" readonly />
        </div>
    </div>



    <div class="form-group row">
        <label class="control-label col-sm-2" for="ProductPrice">Price: </label>
        <div class="col-sm-5">
            <input type="text" asp-for="ProductPrice" asp-format="{0:C}" class="form-control" readonly />
        </div>
    </div>

    <div class="form-group row">
        <label class="control-label col-sm-2" for="ProductDescription">Description: </label>
        <div class="col-sm-5">
            <textarea asp-for="ProductDescription" rows="8" cols="20" class="form-control" readonly></textarea>
        </div>
    </div>

    <div class="form-group row">
        <button class="btn btn-info btn-link" type="submit"> Add to Cart </button>
    </div>

    </div>  
}
person Serge    schedule 09.01.2021
comment
Извините, но я не понимаю, чего вы пытаетесь достичь. - person Serge; 09.01.2021
comment
Я отредактировал свои коды выше в вопросе. Предложенные вами коды возвращают сообщение об ошибке, поскольку оно может найти сведения о конкретном продукте. С недавно отредактированными кодами, как мне вызвать перемещение данных? @Сергей - person iwanttopassmyfyp; 09.01.2021
comment
Я вижу ваш вид сведений, но не вижу там никакой формы. Итак, мне интересно, куда идут данные, когда вы нажимаете ссылку? По href его надо будет создать. Вы пытаетесь переместить детали модели обратно в детали или создать? А когда вам нужно переместить данные из одного действия в другое? - person Serge; 09.01.2021
comment
Я пытаюсь переместить данные из действия «Сведения» в действие «Создать». - person iwanttopassmyfyp; 10.01.2021
comment
@iwanttopassmyfyp Я не понимаю, зачем тебе это нужно. Если продукт не найден, вы просто возвращаете сведения о просмотре с пустым продуктом в качестве модели, в противном случае поля сведений о просмотре будут инициализированы со значениями продукта. Не могли бы вы показать свой вид создания, пожалуйста - person Serge; 10.01.2021