@Html.HiddenFor는 ASP의 목록에서 작동하지 않습니다.NET MVC
목록이 포함된 모델을 속성으로 사용하고 있습니다.SQL Server에서 가져온 항목으로 이 목록을 채우는 중입니다.목록이 보기에 숨겨져서 POST 작업으로 전달되기를 원합니다.나중에 jQuery를 사용하여 이 목록에 더 많은 항목을 추가하면 나중에 확장하기에 적합하지 않은 배열이 될 수 있습니다.일반적으로 사용할 수 있습니다.
@Html.HiddenFor(model => model.MyList)
이 기능을 수행하지만 어떤 이유에서인지 POST의 목록은 항상 null입니다.
매우 간단한 질문입니다. MVC가 왜 이렇게 행동하는지 아시는 분?
방금 이 문제를 발견하고 다음을 수행하여 간단히 해결했습니다.
@for(int i = 0; i < Model.ToGroups.Count; i++)
{
@Html.HiddenFor(model => Model.ToGroups[i])
}
를 사용하여for
대신에foreach
모델 바인딩이 올바르게 작동하고 목록의 숨겨진 값을 모두 선택합니다.이 문제를 해결하는 가장 간단한 방법인 것 같습니다.
HiddenFor는 DisplayFor 또는 EditorFor와 다릅니다.단일 값만 사용하고 컬렉션에서는 작동하지 않습니다.
MVC Futures 프로젝트에서 사용할 수 있는 Serialize HTML 도우미를 사용하여 개체를 Hidden 필드에 직렬화할 수 있습니다. 그렇지 않으면 코드를 직접 작성해야 합니다.더 나은 해결책은 어떤 종류의 ID를 직렬화하고 포스트백 시 데이터베이스에서 데이터를 다시 가져오는 것입니다.
약간 해킹이긴 하지만, 만약에.@Html.EditorFor
또는@Html.DisplayFor
목록에 대해 작업합니다. 게시 요청에 전송되었지만 보이지는 않는지 확인하려면 사용하도록 스타일을 조정할 수 있습니다.display: none;
대신 숨길 수 있습니다. 예:
<div style="display: none;">@Html.EditorFor(model => model.MyList)</div>
Newtonsoft를 사용하여 객체를 json 문자열로 역직렬화한 다음 숨겨진 필드에 삽입하면 어떨까요? 예를 들어, (모델)데이터 응답.Entity.Commission은 JSON에 표시되는 간단한 "CommissionRange" 개체 목록입니다.)
@using (Ajax.BeginForm("Settings", "AffiliateProgram", Model.DataResponse, new AjaxOptions { UpdateTargetId = "result" }))
{
string commissionJson = JsonConvert.SerializeObject(Model.DataResponse.Entity.Commission);
@Html.HiddenFor(data => data.DataResponse.Entity.Guid)
@Html.Hidden("DataResponse_Entity_Commission", commissionJson)
[Rest of my form]
}
렌더링 형식:
<input id="DataResponse_Entity_Commission" name="DataResponse_Entity_Commission" type="hidden" value="[{"RangeStart":0,"RangeEnd":0,"CommissionPercent":2.00000},{"RangeStart":1,"RangeEnd":2,"CommissionPercent":3.00000},{"RangeStart":2,"RangeEnd":0,"CommissionPercent":2.00000},{"RangeStart":3,"RangeEnd":2,"CommissionPercent":1.00000},{"RangeStart":15,"RangeEnd":10,"CommissionPercent":5.00000}]">
저의 경우, 저는 답장을 보내기 전에 숨겨진 필드에서 json을 편집하기 위해 JS 작업을 합니다.
그런 다음 컨트롤러에서 뉴턴소프트를 다시 사용하여 역직렬화합니다.
string jsonCommissionRange = Request.Form["DataResponse_Entity_Commission"];
List<CommissionRange> commissionRange = JsonConvert.DeserializeObject<List<CommissionRange>>(jsonCommissionRange);
Html.HiddenFor
하나의 값만을 위해 설계되었습니다.숨겨진 필드를 만들기 전에 목록을 일련화해야 합니다.
예를 들어 목록이 문자열 유형인 경우 목록을 쉼표로 구분된 목록으로 조인한 다음 컨트롤러에 게시한 후 목록을 분할할 수 있습니다.
모델 값이 컨트롤러로 돌아가지 않는 이유를 파악하기 위해 몇 시간 동안 노력한 끝에 에 대해 숨겨진 값이 EditorFor를 따라야 한다는 것을 알게 되었습니다.
제가 다른 잘못을 저지르지 않는 한 이것이 제가 발견한 것입니다.다시는 실수하지 않겠습니다.
다른 클래스의 목록을 포함하는 모델의 컨텍스트입니다.
이것은 작동하지 않습니다.
@{
for (int i = 0; i < Model.Categories.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(modelItem => Model.Categories[i].Id)
@Html.HiddenFor(modelItem => Model.Categories[i].ProductCategoryId)
@Html.HiddenFor(modelItem => Model.Categories[i].CategoryName)
@Html.DisplayFor(modelItem => Model.Categories[i].CategoryName)
</td>
<td>
@Html.HiddenFor(modelItem => Model.Categories[i].DailyPurchaseLimit)
@Html.EditorFor(modelItem => Model.Categories[i].DailyPurchaseLimit)
@Html.ValidationMessageFor(modelItem => Model.Categories[i].DailyPurchaseLimit)
</td>
<td style="text-align: center">
@Html.HiddenFor(modelItem => Model.Categories[i].IsSelected)
@Html.EditorFor(modelItem => Model.Categories[i].IsSelected)
</td>
</tr>
}
}
어디로 가든지...
for (int i = 0; i < Model.Categories.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(modelItem => Model.Categories[i].Id)
@Html.HiddenFor(modelItem => Model.Categories[i].ProductCategoryId)
@Html.HiddenFor(modelItem => Model.Categories[i].CategoryName)
@Html.DisplayFor(modelItem => Model.Categories[i].CategoryName)
</td>
<td>
@Html.EditorFor(modelItem => Model.Categories[i].DailyPurchaseLimit)
@Html.HiddenFor(modelItem => Model.Categories[i].DailyPurchaseLimit)
@Html.ValidationMessageFor(modelItem => Model.Categories[i].DailyPurchaseLimit)
</td>
<td style="text-align: center">
@Html.EditorFor(modelItem => Model.Categories[i].IsSelected)
@Html.HiddenFor(modelItem => Model.Categories[i].IsSelected)
</td>
</tr>
}
소스 코드를 뒤지기 시작했어요HiddenFor
그리고 제 생각에 당신이 보고 있는 장애물은 당신의 복잡한 사물이MyList
으로 암적으형로변수없환다습니식할으로묵▁type▁notible다▁to▁implicit없▁is 타입으로 변환할 수 없습니다.string
그래서 프레임워크는 당신을 치료합니다.Model
로서 중요시하는.null
렌더링을 수행합니다.value
속성이 비어 있습니다.
당신은 이 해결책을 볼 수 있습니다.
EditorTemplate 안에 HiddenFor만 넣으십시오.
그리고 당신의 견해에 다음과 같이 입력합니다.@Html.EditorFor(model => model.MyList)
효과가 있을 겁니다.
같은 문제에 직면했습니다.루프를 제외하고 목록의 첫 번째 요소만 게시했습니다.루프에 대해 ~를 반복한 후 전체 목록을 유지하고 성공적으로 게시할 수 있습니다.
@if (Model.MyList!= null)
{
for (int i = 0; i < Model.MyList.Count; i++)
{
@Html.HiddenFor(x => x.MyList[i])
}
}
또 다른 옵션은 다음과 같습니다.
<input type="hidden" value=@(string.Join(",", Model.MyList)) />
그foreach
루대 루프신 대신 합니다.for
루프가 약간 더 깨끗한 해결책일 수 있습니다.
@foreach(var item in Model.ToGroups)
{
@Html.HiddenFor(model => item)
}
를 해결할 수 있는 또 각ID를 , 이문를해결를수있또목방다록다법각것입니의은개른을 사용하는 입니다.@Html.DropDownListFor(model => model.IDs)
ID를 저장하는 배열을 채웁니다.
늦었을 수도 있지만 수집에서 숨겨진 필드에 대한 확장 방법을 만들었습니다(단순 데이터 유형 항목 포함).
자, 여기 있습니다.
/// <summary>
/// Returns an HTML hidden input element for each item in the object's property (collection) that is represented by the specified expression.
/// </summary>
public static IHtmlString HiddenForCollection<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression) where TProperty : ICollection
{
var model = html.ViewData.Model;
var property = model != null
? expression.Compile().Invoke(model)
: default(TProperty);
var result = new StringBuilder();
if (property != null && property.Count > 0)
{
for(int i = 0; i < property.Count; i++)
{
var modelExp = expression.Parameters.First();
var propertyExp = expression.Body;
var itemExp = Expression.ArrayIndex(propertyExp, Expression.Constant(i));
var itemExpression = Expression.Lambda<Func<TModel, object>>(itemExp, modelExp);
result.AppendLine(html.HiddenFor(itemExpression).ToString());
}
}
return new MvcHtmlString(result.ToString());
}
사용법은 다음과 같이 간단합니다.
@Html.HiddenForCollection(m => m.MyList)
이 답변에 덧붙여, 저는 다양한 속성을 가진 Model을 가지고 있었는데, 그 중 일부는 IEnumerable이었습니다.제가 한 일은 다음과 같이 보기의 변수에 직렬화하는 것이었습니다.
@{
var serializedObject = JsonSerializer.Serialize(Model);
}
그런 다음 이 문자열을 숨겨진 요소에 넣습니다(HiddenFor는 모델의 단일 값을 대상으로 하므로).
@Html.Hidden("serialized", @serializedObject)
그리고 마지막으로, 컨트롤러에서, 저는 그것을 역직렬화할 수 있었습니다.
JsonSerializer.Deserialize<MyType>(Request.Form["serialized"])
언급URL : https://stackoverflow.com/questions/9385286/html-hiddenfor-does-not-work-on-lists-in-asp-net-mvc
'bestsource' 카테고리의 다른 글
WPF의 ComboBox에 대한 열거 속성 바인딩 (0) | 2023.04.29 |
---|---|
이클립스에서 선택한 리소스에서 Windows 탐색기를 여는 방법 (0) | 2023.04.29 |
디버깅에 Visual Studio web.config 변환 사용 (0) | 2023.04.29 |
찾기: -exec 인수 누락 (0) | 2023.04.29 |
Bash 스크립트 내에서 문자열을 명령으로 실행 (0) | 2023.04.29 |