Создать выпадающий список из enum и связать данные со свойством модели EF - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь привязать выбранное значение в раскрывающемся списке к свойству модели, и после нескольких попыток я не могу понять, что здесь может быть не так.

Я хочу понять, как это происходит при отправке формы,выбранное пользователем значение из выпадающего списка заполнит свойство модели EF.Где model.tblPickup.LocationList - это ENUM, а model.tblPickup.LocationType - это свойство модели EF.

Код MVC (бритва)

<div class="form-group">
                        @Html.LabelFor(model => model.tblPickup.LocationType, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EnumDropDownListFor(model => model.tblPickup.LocationList, "Select Address Type", new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.tblPickup.LocationType, "", new { @class = "text-danger" })
                        </div>
                    </div>

<div class="form-group">
                    @Html.LabelFor(model => model.tblPickup.LocationType, htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.DropDownListFor(model => model.tblPickup.LocationType, new SelectList(Enum.GetValues(typeof(WBusiness.Models.LocationTypes))), "Select Address Type", new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => model.tblPickup.LocationType, "", new { @class = "text-danger" })
                    </div>
                </div>

Код позади - этосоставная модель с тремя классами:

//Actual class creatd by EF
    public partial class tblLocation
        {
            public int Id { get; set; }
            public string LocationName { get; set; }
            public string OtherDetails { get; set; }
            public Nullable<decimal> Latitude { get; set; }
            public Nullable<decimal> Longitude { get; set; }
            public string GoogleLink { get; set; }
            public string PhoneNumber { get; set; }
            public Nullable<int> LocationType { get; set; }
            public Nullable<System.DateTime> CreateDate { get; set; }
            public Nullable<System.DateTime> UpdateDate { get; set; }
            public Nullable<int> ProfileId { get; set; }
            public Nullable<bool> Deleted { get; set; }
            public Nullable<System.DateTime> DeleteDate { get; set; }

            public virtual tblProfile tblProfile { get; set; }
        }

//Partial class to add custom property
    public partial class tblLocation
        {
            public LocationTypes LocationList { get; set; }
        }

//ENUM class
    public enum LocationTypes
        {
            Pickup = 1,
            Delivery = 2
        }
//Composit class with order and location in it
        public class OrderDetailModel
            {
                public tblOrder tblOrder { get; set; }
                public tblLocation tblPickup { get; set; }
            }
//Controller code
[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(OrderDetailModel model)
    {
        if (ModelState.IsValid)
        {
            db.tblOrders.Add(model.tblOrder);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(model);
    }

Когда я пытаюсь отправить форму.Я получаю следующую ошибку:
1. Для первого раскрывающегося списка: хотя поле имеет целочисленный тип, я получаю код, однако ModelState.IsValid равен false .
2. Для второго выпадающего кода: я получаю «Тип местоположения должен быть числом».Это имеет смысл, поскольку тип местоположения является целочисленным полем.

1 Ответ

0 голосов
/ 11 декабря 2018

Это рабочий пример с сайта, который я недавно разработал.EnumDropdown используется в цикле.

//models
public enum SystemDocType
{
    [Display(Name = "Other")]
    Unknown,
    [Display(Name = "Condominium Certification")]
    CondominiumCertification,
    [Display(Name = "Previous Fiscal Years Ending Income/Expense")]
    PrevYearsIncomeExpense,
    [Display(Name = "Reserve Study")]
    ReserveStudy
    //more
}
public class DocumentType
{
    [Key]
    public int Id { get; set; }
    [Display(Name = "System Doc Type")]
    public SystemDocType? SysDocType { get; set; }
    //more
}

//controller
[HttpPost]
[ValidateAntiForgeryToken]
[Route("condo/updatedoctype")]
public async Task<ActionResult> UpdateDocType(FormCollection data, int itemid)
{
    var docType = context.DocTypes.Where(t => t.Id == itemid).FirstOrDefault();
    if (docType != null)
    {
        string val = data["item:" + itemid.ToString() + ":name"];
        int sysType = int.Parse(data["item:" + itemid.ToString() + ":sysdoctype"]);
        docType.TypeName = val;
        docType.SysDocType = (SystemDocType)sysType;
        await context.SaveChangesAsync();
        return RedirectToAction("DocTypes");
    }
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

//.shtml (razor)
@model IEnumerable<fhaApproved2.Models.DocumentType>
@* more *@
@foreach (var item in Model) {
    @Html.EnumDropDownListFor(m => item.SysDocType, 
            htmlAttributes: new { @class = "form-control", @Name = "item:" + @item.Id + ":sysdoctype" })
    <button class="btn btn-primary" type="submit" title="Update Document Type" formaction="/condo/updatedoctype" name="itemid" formmethod="post" value="@item.Id">
        <span class="glyphicon glyphicon-floppy-save"></span>
    </button>
}
...