【发布时间】:2021-06-06 10:05:10
【问题描述】:
我正在尝试创建一个按钮,该按钮采用模型值,计算它们,它们重新传递模型(不丢失已经输入的信息)。我已经尝试为 asp-for="@Model" 传递模型,但这只会引发一个错误,指出 asp-for 不能为空/空白。
型号
{
public int JobId { get; set; }
[Required]
[Display(Name = "Name")]
public string JobName { get; set; }
[Display(Name = "Description")]
public string JobDescription { get; set; }
[Display(Name = "Postcode From")]
public string PostcodeFrom { get; set; }
[Display(Name = "Postcode To")]
public string PostcodeTo { get; set; }
[Display(Name = "Mileage")]
public int TotalMiles { get; set; }
public int? CustomerId { get; set; }
public Customer Customer { get; set; }
}
查看模型
public class JobDetailViewModel
{
public Job Job { get; set; }
public Customer Customer { get; set; }
public List<SelectListItem> Customers { get; set; }
}
控制器动作
public IActionResult Create()
{
var jobDetailViewModel = new JobDetailViewModel();
jobDetailViewModel.Customers = _context.Customers.Select(c => new SelectListItem { Value = c.CustomerId.ToString(), Text = c.CustomerName }).ToList();
return View(jobDetailViewModel);
}
and
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult CalculateMilage(JobDetailViewModel model)
{
model.Job = new Job();
model.Job.TotalMiles = 123;
return View("Create", model);
}
尝试的按钮调用
@model DHSCRM.ViewModels.JobDetailViewModel
<form asp-action="CalculateMilage" method="post">
<input type="hidden" asp-for="@Model" />
<button class="btn btn-info" value="Calculate">Calculate Milage</button>
</form>
每当我点击按钮时,它要么传递一个空白模型,要么失败。我试图忽略 asp-for,但它再次以空白传递,我不完全确定为什么。
有人可以帮忙吗?
谢谢!
编辑 - 整个视图
@model DHSCRM.ViewModels.JobDetailViewModel
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Job</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Job.JobName" class="control-label"></label>
<input asp-for="Job.JobName" class="form-control" />
<span asp-validation-for="Job.JobName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Job.JobDescription" class="control-label"></label>
<input asp-for="Job.JobDescription" class="form-control" />
<span asp-validation-for="Job.JobDescription" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Job.PostcodeFrom" class="control-label"></label>
<input asp-for="Job.PostcodeFrom" class="form-control" />
<span asp-validation-for="Job.PostcodeFrom" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Job.PostcodeTo" class="control-label"></label>
<input asp-for="Job.PostcodeTo" class="form-control" />
<span asp-validation-for="Job.PostcodeTo" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Job.TotalMiles" class="control-label"></label>
<input asp-for="Job.TotalMiles" class="form-control" />
<span asp-validation-for="Job.TotalMiles" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Customer.CustomerName" class="control-label"></label>
<select asp-for="Job.CustomerId" asp-items="@Model.Customers">
<option selected></option>
</select>
<span asp-validation-for="Job.CustomerId" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<form asp-action="CalculateMilage" method="post">
<input type="hidden" asp-for="@Model" />
<button class="btn btn-info" value="Calculate">Calculate Milage</button>
</form>
<hr />
@TempData["ButtonValue"]
<hr />
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
【问题讨论】:
-
你能显示整个视图吗?我不明白为什么您需要将模型传递给视图,然后将其返回给未触及的控制器。
-
嗨,谢尔盖。我现在已经编辑了我的答案,我希望在单击该按钮时能够传递当前模型(如在表单的其余部分中捕获的那样)。考虑一下...我是否需要将按钮放在创建表单的其余部分中?
-
你不能按照你想要的方式来做。您必须提交整个视图,计算并返回。或者您可以使用 ajax 调用控制器操作并将计算值作为 json 返回。在此之后使用 jquery 您可以刷新总里程。
-
好吧好吧,所以在使用模型的时候没有ajax没有办法动态更新页面细节?因此,如果我希望 Model.Field3 成为 Model.Field 1 + Model.Field 2 我必须在 ajax 中这样做?
-
是的,您是正确的,否则您必须提交整个表格。或者,如果它很简单,您可以只使用 jquery 而不要将其发送到服务器。
标签: c# asp.net asp.net-mvc asp.net-core .net-core