program tip

.net MVC Html.CheckBoxFor의 적절한 사용

radiobox 2020. 10. 29. 07:58
반응형

.net MVC Html.CheckBoxFor의 적절한 사용


내가 알고 싶은 Html.CheckBoxFor것은 ASP.NET MVC HTML 도우미에 대한 적절한 구문입니다 .

내가 달성하려는 것은 체크 박스를 처음에 ID 값으로 확인하여 컨트롤러에서 참조하여 여전히 확인되었는지 여부를 확인할 수 있도록하는 것입니다.

아래는 적절한 구문입니까?

@foreach (var item in Model.Templates) 
{ 
    <td> 
        @Html.CheckBoxFor(model => true, item.TemplateId) 
        @Html.LabelFor(model => item.TemplateName)
    </td> 
}

그것은 적절한 구문이 아닙니다.

첫 번째 매개 변수는 체크 박스 값 아니라 체크 박스에 대한 뷰 모델 바인딩이므로 다음과 같습니다.

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

첫 번째 매개 변수는 모델 내에서 부울 속성을 식별해야하며 ( 값을 반환하는 익명 메서드가 아닌 Expression ) 두 번째 속성은 추가 HTML 요소 속성을 정의합니다. 위의 속성이 처음에 체크 박스를 확인할 것이라고 100 % 확신하지는 않지만 시도해 볼 수 있습니다. 그러나 조심하십시오. 작동 할 수 있지만 나중에 유효한 모델 데이터를로드 할 때 문제가 발생할 수 있으며 해당 특정 속성이로 설정됩니다 false.

올바른 방법

적절한 제안 은 해당 특정 부울 속성을 true.

부동산 유형

Asp.net MVC HtmlHelper확장 방법 및 내부 작업에 따라 확인란은 원하는대로 정수가 아닌 부울 값에 바인딩해야합니다. 이 경우 숨겨진 필드에 id.

다른 도우미

물론 체크 박스 값과 동작에 대한 유연성을 높이기 위해 사용할 수있는 다른 도우미 메서드가 있습니다.

@Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true });

참고 : checked 은 HTML 요소 부울 속성이며 값 속성이 아니므로 값을 할당 할 수 있습니다. 올바른 HTML 구문에는 할당이 포함되어 있지 않지만 HTML 요소 속성으로 렌더링되는 정의되지 않은 속성이있는 익명 C # 개체를 제공 할 방법은 없습니다.


기본적으로 아래 코드는 모델 속성이 html 속성을 재정의하므로 선택된 확인란을 생성 하지 않습니다 .

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

대신 GET Action 메서드에서 다음을 수행해야합니다.

model.SomeBooleanProperty = true;

위의 내용은 모델이 유효하지 않은 경우에도 (예 : 양식 게시시 오류가 발생하는 경우) 선택 항목유지합니다 (상자를 선택 취소 한 경우).

그러나 다음 코드는 확실히 체크 된 체크 박스를 생성 하지만 체크 해제 응답을 보존하지 않고 대신 양식의 오류가 발생할 때마다 체크 박스를 체크합니다.

 @Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" });

최신 정보

//Get Method
   public ActionResult CreateUser(int id)
   {
        model.SomeBooleanProperty = true;         
   }

위의 코드는 시작할 때 체크 박스를 생성하고 양식의 오류에도 선택 항목을 보존합니다.


ASP.NET MVC 5에서 문제가 발생했습니다. 여기서 CheckBoxFor는 내 모델의 값이 true로 설정되어 있음에도 불구하고 서버 측 유효성 검사 실패시 내 확인란을 확인하지 않습니다. 내 Razor 마크 업 / 코드는 다음과 같습니다.

@Html.CheckBoxFor(model => model.MyBoolValue, new { @class = "mySpecialClass" } )

이 작업을 수행하려면 다음과 같이 변경해야했습니다.

@{
    var checkboxAttributes = Model.MyBoolValue ?
        (object) new { @class = "mySpecialClass", @checked = "checked" } :
        (object) new { @class = "mySpecialClass" };
}
@Html.CheckBox("MyBoolValue", checkboxAttributes)

이것을 모델에 배치하십시오.

[DisplayName("Electric Fan")]
public bool ElectricFan { get; set; }

private string electricFanRate;

public string ElectricFanRate
{
    get { return electricFanRate ?? (electricFanRate = "$15/month"); }
    set { electricFanRate = value; }
}

그리고 이것은 당신의 cshtml에서 :

<div class="row">
    @Html.CheckBoxFor(m => m.ElectricFan, new { @class = "" })
    @Html.LabelFor(m => m.ElectricFan, new { @class = "" })
    @Html.DisplayTextFor(m => m.ElectricFanRate)
</div>

다음을 출력합니다.

MVC Output 확인란 또는 굵은 레이블을 클릭하면 확인란을 선택 / 선택 취소합니다.


CSHTML에 다음을 추가 할 때까지 POST에서 다시 바인딩 할 때 위의 답변 중 어느 것도 나를 위해 작동하지 않았습니다.

<div class="checkbox c-checkbox">
    <label>
        <input type="checkbox" id="xPrinting" name="xPrinting" value="true"  @Html.Raw( Model.xPrinting ? "checked" : "")>
        <span class=""></span>Printing
    </label>
</div>


// POST: Index

[HttpPost]
public ActionResult Index([Bind(Include = "dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xEmbroidery,xPersonalization,sortOrder,radioOperator")] ProductionDashboardViewModel model)

다음과 같이 데이터베이스에서 동적으로 레이블을 표시하는 솔루션을 찾고있었습니다.

checkbox1 : Option 1 text from database
checkbox2 : Option 2 text from database
checkbox3 : Option 3 text from database
checkbox4 : Option 4 text from database

그래서 위의 솔루션 중 어느 것도 나를 위해 일하지 않았으므로 다음과 같이 사용했습니다.

 @Html.CheckBoxFor(m => m.Option1, new { @class = "options" }) 
 <label for="Option1">@Model.Option1Text</label>

 @Html.CheckBoxFor(m => m.Option2, new { @class = "options" }) 
 <label for="Option2">@Mode2.Option1Text</label>

이런 식으로 사용자가 레이블을 클릭하면 확인란이 선택됩니다.

누군가를 도울 수 있습니다.


나는 이것을 작동시키는 데 어려움을 겪었고 FromCollection을 사용하기를 원하거나 필요로하는 사람을 위해 다른 솔루션을 추가했습니다.

대신에:

@Html.CheckBoxFor(model => true, item.TemplateId) 

HTML 도우미를 다음과 같이 포맷하십시오.

@Html.CheckBoxFor(model => model.SomeProperty, new { @class = "form-control", Name = "SomeProperty"})

그런 다음 로직이 어디에 있든 viewmodel / model에서 :

public void Save(FormCollection frm)
{   
    // to do instantiate object.

    instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase);

    // to do and save changes in database.
}

참고URL : https://stackoverflow.com/questions/12674572/proper-usage-of-net-mvc-html-checkboxfor

반응형