세션을 사용하여 유지되는 체크 상태를 가질 체크 박스 목록을 만들기위한 html 도우미를 작성하려고합니다. 대부분의 경우 작동하며 확인란을 선택하거나 선택을 취소하고 제출을 클릭하면 확인란 상태를 기억합니다. 그러나 확인란을 선택하고 제출 한 다음 체크 박스를 지우고 다시 제출하면 (모두 선택 취소 된 경우) 마지막 선택 사항을 기억하고 싶은 것 같습니다. 여기에 ... 내가 작성한 것입니다MVC에 확인란 목록을 유지하는 방법
[HomeController]
public ActionResult Index()
{
TestViewModel tvm = new TestViewModel();
return View(tvm);
}
[HttpPost]
public ActionResult Index(TestViewModel viewModel)
{
viewModel.SessionCommit();
return View(viewModel);
}
[색인보기]
@model TestApp.Models.TestViewModel
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm())
{
<p>Checkboxes:</p>
@Html.CheckedListFor(x => x.SelectedItems, Model.CheckItems, Model.SelectedItems)
<input type="submit" name="Submit form" />
}
[TestViewModel]
// Simulate the checklist data source
public Dictionary<int, string> CheckItems
{
get
{
return new Dictionary<int, string>()
{
{1, "Item 1"},
{2, "Item 2"},
{3, "Item 3"},
{4, "Item 4"}
};
}
}
// Holds the checked list selections
public int[] SelectedItems { get; set; }
// Contructor
public TestViewModel()
{
SelectedItems = GetSessionIntArray("seld", new int[0]);
}
// Save selections to session
public void SessionCommit()
{
System.Web.HttpContext.Current.Session["seld"] = SelectedItems;
}
// Helper to get an int array from session
int[] GetSessionIntArray(string sessionVar, int[] defaultValue)
{
if (System.Web.HttpContext.Current.Session == null || System.Web.HttpContext.Current.Session[sessionVar] == null)
return defaultValue;
return (int[])System.Web.HttpContext.Current.Session[sessionVar];
}
,
[HTML 헬퍼는]
public static MvcHtmlString CheckedList(this HtmlHelper htmlHelper, string PropertyName, Dictionary<int, string> ListItems, int[] SelectedItemArray)
{
StringBuilder result = new StringBuilder();
foreach(var item in ListItems)
{
result.Append(@"<label>");
var builder = new TagBuilder("input");
builder.Attributes["type"] = "checkbox";
builder.Attributes["name"] = PropertyName;
builder.Attributes["id"] = PropertyName;
builder.Attributes["value"] = item.Key.ToString();
builder.Attributes["data-val"] = item.Key.ToString();
if (SelectedItemArray.Contains(item.Key))
builder.Attributes["checked"] = "checked";
result.Append(builder.ToString(TagRenderMode.SelfClosing));
result.AppendLine(string.Format(" {0}</label>", item.Value));
}
return MvcHtmlString.Create(result.ToString());
}
public static MvcHtmlString CheckedListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Dictionary<int, string> ListItems, int[] SelectedItemArray)
{
var name = ExpressionHelper.GetExpressionText(expression);
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
return CheckedList(htmlHelper, name, ListItems, SelectedItemArray);
}
나는 this SO question을 읽은 나는 검사에는 체크 박스가 존재하지 않게되었을 때에,이 모델 바인더가 모르는와 함께 할 수있다 생각하지만, 나는 그 겪었어요하더라도 기타 다양한 게시물 - 나는 더 이상 앞으로 나아 가지 않습니다.
하나의 게시물에서 나는 숨겨진 필드가 확인란의 '거짓'상태를 전달하기 위해 확인란과 함께 사용되는 것을 보았지만 하나의 속성으로 여러 확인란을 사용하여 게시 할 수는 없었습니다. .
누구든지이 문제에 관해 밝힐 수 있습니까?
EDITED : demonstration project이 게시물에 강조 표시되어 있습니다. 바라기를 이것은 누군가 나를 도울 수 있습니다!
위대한 반응과 거의 이해합니다. 답안에서 3과 4를 분명히 설명해 주시겠습니까? 나는 표현식을 사용하지 않는다는 것을 (4 절) 이해하지만 표현식의 값을 int 배열로 얻는 방법은 무엇입니까? 나는 당신의 추천을 듣지만, 나는 패키지/블랙 박스에 의존하는 대신에 이런 것들을 스스로하는 법을 배우고 싶다. 몇 달 전에 만 MVC를 시작 했으므로 여전히 MVC를 통해 작업하고 있습니다. – Simon
항목 3 : 방법을 보려면 [private static MvcHtmlString InputHelper (...)] (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Html/InputExtensions.cs) 메서드를 참조하십시오. 도우미는 전형적으로'value' 속성과 검사 순서를 설정합니다. 'ModelState'가 먼저 체크 된 이유를 이해하려면 [이 답변]의 두 번째 부분 (http://stackoverflow.com/questions/26654862/textboxfor-displaying-initial-value-not-the-value-updated-from)을 참조하십시오. -code/26664111 # 26664111) –
Item 4 :'ModelMetadata'의'Model' 속성은 모델을 포함하고 있습니다. 따라서'check CheckedList (htmlHelper, name, ListItems, metadata.Model);를 사용하고 마지막 매개 변수 –