MVC3 Показать раскрывающийся список из одного источника данных и сохранить в другом источнике данных - PullRequest
0 голосов
/ 17 октября 2011

Я возвращаюсь к проекту MVC3 после трехмесячного перерыва. Мне нужно отобразить выпадающий список, который извлекается из базы данных A, но сохраняется в базе данных B. Мне нужно сохранить свойство - это код NAICS / SIC. Прямо сейчас я просто предоставляю пользователю текстовое поле для ввода текста произвольной формы. Итак, у меня есть механика этого вниз. Но вместо этого он должен предоставлять только действительный список кодов из исходной базы данных.

Хитрость заключается в том, что я использую привязку пользовательской модели для генерации моих моделей представления на лету, поэтому у меня нет отдельного файла .cshtml для настройки.

[Serializable]
    public class Step4ViewModel : IStepViewModel
    {
        public Step4ViewModel()
        {


        }


        //load naics codes from somewhere

        [Display(Name = "Describe the nature of your business.")]
        public String NatureOfBusiness { get; set; }


        [Display(Name="NAICS/SIC CODE")]
        public String BusinessTypeCode { get; set; }

Tricky ViewModel

@using Microsoft.Web.Mvc;
@using Tangible.Models;

@model Tangible.Models.WizardViewModel 

@{ 
    var currentStep = Model.Steps[Model.CurrentStepIndex];
    var progress = ((Double)(Model.CurrentStepIndex) / Model.Steps.Count) * 100;
} 
<script type="text/javascript">
    $(function () {
        $("#progressbar").progressbar({
            value: @progress
        });
    });

</script> 

<div id="progressbar" style="height:20px;">
<span style="position:absolute;line-height:1.2em; margin-left:10px;">Step @(Model.CurrentStepIndex + 1) out of @Model.Steps.Count</span> 
</div>
    @Html.ValidationSummary()
@using (Html.BeginForm())
{ 


    @Html.Serialize("wizard", Model) 

    @Html.Hidden("StepType", Model.Steps[Model.CurrentStepIndex].GetType()) 


    @Html.EditorFor(x => currentStep, null, "") 



    if (Model.CurrentStepIndex > 0)
    { 
        <input type="submit" value="Previous" name="prev" /> 
    }

    if (Model.CurrentStepIndex < Model.Steps.Count - 1)
    { 
        <input type="submit" value="Save &amp; Continue" name="next"  /> 
    }
    else
    { 
        <input type="submit" value="Finish" name="finish" /> 
    }

         @*<input type="submit" value="Save" name="Save" />*@
}

Контроллер

[HttpPost]
        public ActionResult Index([Deserialize] WizardViewModel wizard, IStepViewModel step)
        {


            wizard.Steps[wizard.CurrentStepIndex] = step;
            if (ModelState.IsValid)
            {

                    //Always save.
                    var obj = new dr405();

                    //wire up to domain model;
                    foreach (var s in wizard.Steps)
                    {
                        Mapper.Map(s,obj,s.GetType(), typeof(dr405));
                    }

                    using (var service = new DR405Service())
                    {
                        //Do something with a service here.
                        service.Save(db, obj);
                    }


                if (!string.IsNullOrEmpty(Request["next"]))
                {
                    wizard.CurrentStepIndex++;
                }
                else if (!string.IsNullOrEmpty(Request["prev"]))
                {
                    wizard.CurrentStepIndex--;
                }
                else
                {
                    return View("Upload", obj);

                }
            }
            else if (!string.IsNullOrEmpty(Request["prev"]))
            {
                wizard.CurrentStepIndex--;
            }

            return View(wizard);


        }

WizardViewModel

 [Serializable]
    public class WizardViewModel
    {

        public String AccountNumber { get; set; }
        public int CurrentStepIndex { get; set; }
        public Boolean IsInitialized { get { return _isInitialized; } }

        public IList<IStepViewModel> Steps { get; set; }

        private Boolean _isInitialized = false;

        public void Initialize()
        {
            try
            {
                Steps = typeof(IStepViewModel)
                    .Assembly.GetTypes().Where(t => !t.IsAbstract && typeof(IStepViewModel).IsAssignableFrom(t)).Select(t => (IStepViewModel)Activator.CreateInstance(t)).ToList();
                _isInitialized = true;
                //rewrite this.  get the profile and wire them up or something.
                this.AccountNumber = Tangible.Profiles.DR405Profile.CurrentUser.TangiblePropertyId;

            }
            catch (Exception e)
            {

                _isInitialized = false;
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Вы можете указать шаблон для конкретного свойства в вашей модели представления, добавив в поле атрибут UIHint.Поскольку ваше представление вызывает EditorFor для модели, оно будет использовать шаблон, который вы указали с помощью UIHint.

BusinessTypeDropdown.ascx - (помещается в Views / Shared / EditorTemplates

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<% var businessTypes = ViewData["businessTypes"] as IEnumerable<string>; %>
<%= Html.DropDownListFor(m => m , new SelectList(businessTypes, Model))%>

В вашей модели просмотра

[Serializable]
public class Step4ViewModel : IStepViewModel
{
    public Step4ViewModel()
    {


    }


    //load naics codes from somewhere

    [Display(Name = "Describe the nature of your business.")]
    public String NatureOfBusiness { get; set; }


    [Display(Name="NAICS/SIC CODE")][UIHint("BusinessTypeDropdown")]
    public String BusinessTypeCode { get; set; }

Затем в вашем контроллере просто установите ViewData["businessTypes"] для вашего списка типов бизнеса.

0 голосов
/ 17 октября 2011

Без понимания вашего «хитрого» кода модели представления будет сложно сделать полезные предложения.

Однако здесь не должно быть особых проблем.Вам нужно каким-то образом создать выпадающий список в виде yoru и заполнить его данными, переданными с вашего контроллера.

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

...