如何解决如何在表单的同一控制器中将数据从一个操作移动到另一个操作?
如何将数据从 Iactionresult 移动到另一个 action result?我一直在尝试显示表单中的数据并查看另一个 Iactionresult?我尝试使用 Tempdata,但似乎有错误。有人可以帮我吗?
当我点击特定 ID 时,此操作会显示单个产品详细信息。
[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>
我得到的错误信息是:
解决方法
这应该是 GET 操作,而不是 POST 操作,然后您应该从 TempData 中提取信息并将其作为参数传递给视图 cshtml。
TempData["Product"] = JsonConvert.SerializeObject(lstProduct[0]);
return RedirectToAction("Create");
现在您可以在 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();
}
,
如果你想将数据从一个动作移动到同一个控制器中的另一个动作 只需从另一个动作调用一个动作并将数据作为另一个动作的输入参数即可。
要将消息发送到索引操作,首先要为消息创建一个类:
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
}
并且您必须在所有视图中添加
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。