Передача значений из элементов SelectList с помощью ViewModel

введите здесь описание изображения

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

public ActionResult UploadDoc(IEnumerable<HttpPostedFileBase> files)
{
    foreach (var file in files)
    {
        if (file != null && file.ContentLength > 0)
        {
            byte[] data = new byte[file.ContentLength];
            file.InputStream.Read(data, 0, file.ContentLength);

            Document doc = new Document
            {
                UploadedOn = DateTime.Now,
                MimeType = file.ContentType,
                UserName = User.Identity.Name,
                Data = data,
                FromLanguage = 1,
                ToLanguage = 2
            };

            dbContext = new MedicalDb();
            dbContext.Documents.Add(doc);
            dbContext.SaveChanges();
        }
    }
    return RedirectToAction("Index");
}  

но я также хотел бы получить выбранные значения из раскрывающихся списков, чтобы я мог заполнить свойства FromLanguage и ToLanguage документов. Я думаю, мне понадобится модель просмотра, но я не знаю, как это сделать. Новые строки для загрузки документов добавляются с помощью jQuery, а имена ddls — «ddlFromLanguage1», «ddlFromLanguage2», «ddFromLanguage3» и «ddlToLanguage1», «ddlToLanguage2», «ddlToLanguage3» и т. д. Заранее спасибо за любую помощь.

<form action="UploadDoc" method="post" enctype="multipart/form-data">    
<table id="tblUploadDocs">
    <tr id="row1">
        <td><input type="file" name="files" id="file1" /></td>
        <td>Bu dilden</td>
        <td>@Html.DropDownList("ddlFromLanguage1", ViewBag.Languages as SelectList)</td>
        <td>şu dile çevrilecek</td>
        <td>@Html.DropDownList("ddlToLanguage1", ViewBag.Languages as SelectList)</td>
    </tr>
</table>
<br />
<a href="javascript:addRow();" style="margin:10px 0;">Yeni dosya ekleyin</a>
<input type="submit"  />
</form>

person burakk    schedule 19.03.2013    source источник
comment
Я думаю, что ваш вопрос недостаточно ясен. Также проверьте здесь, чтобы использовать модель просмотра со списком выбора...   -  person AliRıza Adıyahşi    schedule 19.03.2013


Ответы (3)


Любая отправленная обратно форма возвращает FormCollection контроллеру в дополнение к значениям, связанным с моделью.

Например

  //In your view
  @using (Html.BeginForm("CountrySelect", "Country", FormMethod.Post))
            {
                @Html.AntiForgeryToken()
                <select name="country" id="country-select">
                   <option value="selector">Pick a Country</option>
                   <option value="England">England</option>
                   <option value="England">England</option> 
                </select>         
            }

//In controller
//This will get you the name of the selected country from your form
[HttpPost]
Public ActionResult CountrySelect(FormCollection formData)
{
   string country = formData["country"].toString();
}
person krilovich    schedule 19.03.2013

Я думаю, вам нужно посмотреть на хороший пример и сделать то же самое или очень похоже на них.

Взгляните на это:

Это должно вас заинтересовать.

Пожалуйста, дайте мне знать, если у вас не получится, или если то, что я вам дал, было действительно полезно.

Спасибо

person Display Name    schedule 19.03.2013

Решение:

Модель просмотра:

public class CustomerDocUploadViewModel
{
    public HttpPostedFileBase File { get; set; }
    public int FromLanguage { get; set; }
    public int ToLanguage { get; set; }
}

Вид:

@model IList<Models.ViewModels.CustomerDocUploadViewModel>

...

<form action="UploadDoc" method="post" enctype="multipart/form-data">    
<table id="tblUploadDocs">
    <tr id="row1">
        <td><input type="file" name="[0].File" /></td>
        <td>Bu dilden</td>
        <td>@Html.DropDownList("[0].FromLanguage", ViewBag.Languages as SelectList)</td>
        <td>şu dile çevrilecek</td>
        <td>@Html.DropDownList("[0].ToLanguage", ViewBag.Languages as SelectList)</td>
    </tr>
</table>
<br />
<a id="lnkAdd" href="javascript:addRow();" style="margin:10px 0;">Yeni dosya ekleyin</a>
<input type="submit"  />
</form>

и, наконец, метод действия в контроллере:

[HttpPost]
    public ActionResult UploadDoc(IList<CustomerDocUploadViewModel> docInfos)
    {
        for (int i = 0; i < docInfos.Count; i++)
        {
            if (docInfos.ElementAt(i).File != null && docInfos.ElementAt(i).File.ContentLength > 0)
            {
                byte[] data = new byte[docInfos.ElementAt(i).File.ContentLength];
                docInfos.ElementAt(i).File.InputStream.Read(data, 0, docInfos.ElementAt(i).File.ContentLength);

                // Save the file into the database
                Document doc = new Document
                {
                    UploadedOn = DateTime.Now,
                    MimeType = docInfos.ElementAt(i).File.ContentType,
                    UserName = User.Identity.Name,
                    Data = data,
                    FromLanguage = docInfos.ElementAt(i).FromLanguage,
                    ToLanguage = docInfos.ElementAt(i).ToLanguage
                };

                dbContext = new MedicalDb();
                dbContext.Documents.Add(doc);
                dbContext.SaveChanges();
            }
        }    
        return RedirectToAction("Index");
    }     
person burakk    schedule 20.03.2013