我有一个复合视图模型,其中包含一个用于显示信息的模型和一个用于从用户读取信息的模型,因此我可以验证它。问题是,当我尝试仅传递用于读取信息的模型作为参数时,它的值为空。但是当我尝试传递整个复合视图模型时,我得到了正确的值。我只想验证用于使用
ModelState.IsValid
读取信息的模型,并且不需要传递整个复合视图模型。也许有某种方法可以指定 HTTPPost 方法应该接收什么模型?
这是复合视图模型:
public class ProductViewModel
{
public ProductViewModel() { }
public ProductViewModel(ProductDisplayModel productDisplayModel)
{
ProductDisplayModel = productDisplayModel;
CreateReviewModel = new CreateReviewModel();
}
public ProductDisplayModel ProductDisplayModel { get; set; }
public CreateReviewModel CreateReviewModel { get; set; }
}
视图,我试图从中获取值:
@model ProductViewModel
<form class="add-review-container" method="post" asp-action="CreatedReview" asp-controller="Review">
<input name="productID" value="@Model.ProductDisplayModel.Product.ProductID" hidden />
<div class="information-container">
<div class="profile-container">
<img class="profile-picture"></img>
<div class="username-container">
<p class="username">@User.Identity.Name</p>
</div>
</div>
<div class="rating-container">
<div class="rating">
@for (int i = 5; i >= 1; i--)
{
<input value="@i" id="star_@i" type="radio" asp-for="CreateReviewModel.Rating">
<label title="@i" for="star_@i"></label>
}
</div>
</div>
</div>
<textarea class="review-input-box" placeholder="Write a review about the product..." asp-for="CreateReviewModel.Comment"></textarea>
<div class="post-review-button-container">
<button class="post-review-button">Post</button>
</div>
</form>
这是正确传递输入值的方法:
[HttpPost]
public async Task<IActionResult> CreatedReview(int productID, ProductViewModel viewModel) //here the values are passed correctly in viewModel.CreateReviewModel
{
if (ModelState.IsValid)
{
//code
}
}
这是方法,其中输入值为空:
[HttpPost]
public async Task<IActionResult> CreatedReview(int productID, CreateReviewModel viewModel)//here the values are null
{
if (ModelState.IsValid)
{
//code
}
}
由于您有一个复合视图模型,并且您只想传递用于读取信息的模型作为参数。因此,您可以使用部分视图来实现此功能。
您可以像这样修改您的视图:
_CreatedPartial
的局部视图。然后您可以将与 CreateReviewModel
相关的代码移至此部分视图。@model CreateReviewModel
<div class="information-container">
<div class="profile-container">
<img class="profile-picture"></img>
<div class="username-container">
<p class="username">user name like liya</p>
</div>
</div>
<div class="rating-container">
<div class="rating">
@for (int i = 5; i >= 1; i--)
{
<input value="@i" id="star_@i" type="radio" name="Rating">
<label title="@i" for="star_@i"></label>
}
</div>
</div>
</div>
<textarea class="review-input-box" placeholder="Write a review about the product..." name="Comment"></textarea>
CreatedReview
的主视图中,您应该在原始位置引用此部分视图。<div>
@await Html.PartialAsync("_CreatedPartial", Model.CreateReviewModel)
</div>
结果: