2011-05-24 18 views
21

इस मॉडल को देखते हुए, क्या पृष्ठ पर फ़ाइल अपलोड इनपुट तत्व प्रस्तुत करने के लिए Html.EditorFor() का उपयोग करना संभव है? मैंने फ़ाइल नाम के डेटाटाइप के साथ खेला, और यह निश्चित रूप से प्रस्तुत संपादक रूप को प्रभावित कर रहा था।संपादक के लिए <इनपुट प्रकार = "फ़ाइल"> बनाने के लिए इस्तेमाल किया जा सकता है?

public class DR405Model 
{ 
    [DataType(DataType.Text)] 
    public String TaxPayerId { get; set; } 
    [DataType(DataType.Text)] 
    public String ReturnYear { get; set; } 

    public String FileName { get; set; } 
} 

जोरदार टाइप * .aspx पेज इस

<div class="editor-field"> 
     <%: Html.EditorFor(model => model.FileName) %> 
     <%: Html.ValidationMessageFor(model => model.FileName) %> 
    </div> 
+4

एमवीसी 4 - मैं सोच रहा हूं कि क्यों DataType.Upload टाइप = "फ़ाइल" – felickz

उत्तर

35

पर एक नज़र यह अधिक भावना HttpPostedFileBase उपयोग करने के लिए अपने दृश्य पर एक अपलोड की गई फ़ाइल का प्रतिनिधित्व करने के होगा लेने string के बजाय मॉडल:

public class DR405Model 
{ 
    [DataType(DataType.Text)] 
    public string TaxPayerId { get; set; } 

    [DataType(DataType.Text)] 
    public string ReturnYear { get; set; } 

    public HttpPostedFileBase File { get; set; } 
} 

तो आप निम्न दृश्य हो सकता है:

<% using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %> 

    ... input fields for other view model properties 

    <div class="editor-field"> 
     <%= Html.EditorFor(model => model.File) %> 
     <%= Html.ValidationMessageFor(model => model.File) %> 
    </div> 

    <input type="submit" value="OK" /> 
<% } %> 

और अंत में ~/Views/Shared/EditorTemplates/HttpPostedFileBase.ascx अंदर इसी संपादक टेम्पलेट को परिभाषित:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<input type="file" name="<%: ViewData.TemplateInfo.GetFullHtmlFieldName("") %>" id="<%: ViewData.TemplateInfo.GetFullHtmlFieldId("") %>" /> 

अब नियंत्रक इस प्रकार दिखाई देंगे:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new DR405Model()); 
    } 

    [HttpPost] 
    public ActionResult Index(DR405Model model) 
    { 
     if (model.File != null && model.File.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(model.File.FileName); 
      var path = Path.Combine(Server.MapPath("~/App_Data"), fileName); 
      model.File.SaveAs(path); 
     } 

     return RedirectToAction("Index"); 
    } 
} 
+0

धन्यवाद यह वह उत्तर है जिसे मैं ढूंढ रहा था। –

+8

आप '@ Html.TextBoxFor (x => x.File, new {type =" file "}) ' –

+0

@Darin- डेटा का प्रकार भी होगा यदि मैं डेटाबेस में फ़ाइल यूआरएल सहेज रहा हूं। मॉडल में आपके पास है - "HttpPostedFileBase" –

0

तरह लग रहा है नहीं लेकिन http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx

+0

प्रस्तुत नहीं करता है पहले से ही बनाया गया है। शायद मैं गलत दिशा जा रहा हूँ। मेरे पास aspnet_db प्रोफाइल डेटा है, मुझे अपलोड की गई फ़ाइल से शादी करने की आवश्यकता होगी। इसलिए, उपयोगकर्ता फ़ाइल को 'user_id' + 'date' +' xlsx "के साथ सर्वर पर सहेजा जाता है, मैं सोच रहा था कि मुझे एक मॉडल बनाने की आवश्यकता है, जिसमें फ़ाइल ऑब्जेक्ट से परे गुण थे। –

5

यहाँ एक है एमवीसी 5 के लिए उदाहरण (HTMLAttributes के लिए आवश्यक)।

\ दृश्य HttpPostedFileBase.cshtml नामक एक फ़ाइल ~ के तहत के रूप में इस बनाएं \ साझा \ EditorTemplates

@model HttpPostedFileBase 
@{ 
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 
    htmlAttributes["type"] = "file"; 
} 
@Html.TextBoxFor(model => model, htmlAttributes) 

यह सही आईडी और नाम के साथ नियंत्रण उत्पन्न करता है और काम करता है जब एक मॉडल EditorFor टेम्पलेट से संग्रह का संपादन।

+0

यह ध्यान रखना महत्वपूर्ण है कि दृश्यों के पीछे और भी आगे बढ़ रहा है। उपरोक्त काम नहीं करेगा जब तक .cshtml फ़ाइल की गुणों में कोई सेटिंग स्विच नहीं हो जाती: कार्य बनाएं, कोई नहीं -> सामग्री। इस प्रश्न पर एक प्रतिक्रिया के अनुसार: [लिंक] (http://stackoverflow.com/questions/6782769/why-is-my-editor-template-ignored-when-i-call-editorformodel) – GG2

+0

अंक के जोड़े, निर्माण .cshtnl की क्रिया डिफ़ॉल्ट रूप से सामग्री है और जिस उत्तर का आप उल्लेख कर रहे हैं वह 2011 से है और एमवीसी 3 - एमवीसी 5 के बारे में बात करता है मुझे इस काम को बनाने में कोई बदलाव नहीं करना पड़ा –

+0

हवा की तरह काम करता है। संपादक टेम्पलेट के अलावा कोई अतिरिक्त परिवर्तन की आवश्यकता नहीं है – Nitin

3

जोड़ें: htmlAttributes = नए {प्रकार = "फ़ाइल"}

<div class="editor-field"> 
    <%: Html.EditorFor(model => model.FileName, new { htmlAttributes = new { type = "file" }) %> 
    <%: Html.ValidationMessageFor(model => model.FileName) %> 
</div> 

नोट: मैं MVC 5 उपयोग कर रहा हूँ, मैं अन्य संस्करणों पर परीक्षण नहीं किया।

संबंधित मुद्दे

 संबंधित मुद्दे