我有以下两个模型类:-
public Submission()
{
SubmissionQuestionSubmission = new HashSet<SubmissionQuestionSubmission>();
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Npi { get; set; }
public bool Independent { get; set; }
public string Comment { get; set; }
public virtual ICollection<SubmissionQuestionSubmission> SubmissionQuestionSubmission { get; set; }
}
public partial class SubmissionQuestionSubmission
{
public int SubmissionQuestionId { get; set; }
public int SubmissionId { get; set; }
public string Answer { get; set; }
public virtual Submission Submission { get; set; }
}
并且我创建了以下视图模型:-
public class SubmissionCreate
{
public Submission Submission {set; get;}
public IList<SubmissionQuestion> SubmissionQuestion { set; get; }
public IList<SubmissionQuestionSubmission> SubmissionQuestionSubmission { set; get; }
}
然后在我看来,我只需要提交以下字段:-
@model LandingPageFinal3.ViewModels.SubmissionCreate
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Submission.FirstName" class="control-label"></label>
<input asp-for="Submission.FirstName" class="form-control" />
<span asp-validation-for="Submission.FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Submission.LastName" class="control-label"></label>
<input asp-for="Submission.LastName" class="form-control" />
<span asp-validation-for="Submission.LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Submission.Npi" class="control-label"></label>
<input asp-for="Submission.Npi" class="form-control" />
<span asp-validation-for="Submission.Npi" class="text-danger"></span>
</div>
<div class="form-group form-check">
<label class="form-check-label">
<input class="form-check-input" asp-for="Submission.Independent" /> @Html.DisplayNameFor(model => model.Submission.Independent)
</label>
</div>
<div class="form-group">
<label asp-for="Submission.Comment" class="control-label"></label>
<textarea asp-for="Submission.Comment" class="form-control"></textarea>
<span asp-validation-for="Submission.Comment" class="text-danger"></span>
</div>
<div id="additionalInfo">
@for (var i = 0; i < Model.SubmissionQuestion.Count(); i++)
{
<label>@Model.SubmissionQuestion[i].Question</label><br />
<input asp-for="@Model.SubmissionQuestion[i].Question" hidden />
<textarea asp-for="@Model.SubmissionQuestionSubmission[i].Answer" class="form-control"></textarea>
<input asp-for="@Model.SubmissionQuestionSubmission[i].SubmissionQuestionId" hidden />
<br />
}
</div>
所以我在post action方法内定义以下绑定,以仅绑定视图内的字段,如下所示:-
public async Task<IActionResult> Create([Bind(Submission.FirstName,Submission.LastName,Submission.Npi,Submission.Independent" +
"Submission.Comment,SubmissionQuestionSubmission.Answer,SubmissionQuestionSubmission.SubmissionQuestionId")] SubmissionCreate sc )
{
但是sc.Submission
和sc.SubmissionQuestionSubmission
在我的action方法中将为null ...所以不确定我应该定义的最小绑定是什么,以防止通过回传除之外的其他信息和导航属性来入侵我们的应用程序在我看来定义的那些?
您不需要使用bind
来仅绑定显示在视图中的字段。
实际上,您的视图已为需要显示的字段设置了name
属性,因此SubmissionCreate sc
仅在接受时绑定视图中的相应字段。
只需使用此代码即可接收:
public async Task<IActionResult> Create(SubmissionCreate sc)
{
return View();
}