5

Sto tentando di caricare immagini nella mia applicazione ma restituisce sempre null. Non riesco a trovare il problema qui. Mi puoi aiutare? Ecco il mio codice.Caricamento file in MVC quando utilizzato nei ritorni modali bootstrap null

Modello


[Table("Slider")] 
public partial class Slider : BaseModel 
{ 
    [Required] 
    [StringLength(200)] 
    public string FileName { get; set; } 

    [StringLength(200)] 
    public string Title { get; set; } 

    [StringLength(1000)] 
    public string Description { get; set; } 

    public int? Order { get; set; } 
} 


[NotMapped] 
public class SliderImage : Slider 
{ 
    public HttpPostedFileBase ImageFile { get; set; } 
} 

View


@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
@Html.AntiForgeryToken() 
<div class="modal-body"> 
    <div class="form-horizontal"> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.Id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.FileName, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(model => model.FileName, new { @class = "form-control", @readonly = "readonly" }) 
       @Html.ValidationMessageFor(model => model.FileName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.ImageFile, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(m => m.ImageFile, new { @class = "form-control", type = "file" }) 
       //This is Same as below 
       //<input class="form-control" id="ImageFile" name="ImageFile" type="file" value=""> 
      </div> 
     </div> 

controller


public ActionResult Edit(int id) 
    { 
     Slider slider = _db.Sliders.Find(id); 
     if (slider == null) 
     { 
      return HttpNotFound(); 
     } 
     Mapper.CreateMap<Slider, SliderImage>(); 
     SliderImage sliderImage = Mapper.Map<Slider, SliderImage>(slider); 
     return PartialView("_Edit", sliderImage); 
    } 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditSlider([Bind(Include = "Id,FileName,Title,Description,Order,IsActive,Name,ImageFile")] SliderImage sliderImage) 
    { 
     if (ModelState.IsValid) 
     { 
      Mapper.CreateMap<SliderImage, Slider>(); 
      Slider slider = Mapper.Map<SliderImage, Slider>(sliderImage); 
      _db.Entry(slider).State = EntityState.Modified; 
      _db.SaveChanges(); 
      return Json(new { success = true }); 
     } 
     return PartialView("_EditSlider"); 
    } 

Cosa sto sbagliando io questo?


stato rilevato il problema

sto vincolante la vista parziale all'interno del popup modale bootstrap. Quando carico dal popup, il caricamento restituisce null. Invece se apro la vista parziale direttamente nel browser, il file è presente nel modello. Quindi non c'è nessun problema con il caricamento di file. Il problema è con popup modale o qualcosa del genere.

quando si utilizza Bootstrap modello When Using Bootstrap model

Quando si utilizza parziale vista Directy When using partial View Directy

Controllare la differenza trovata quando si utilizza violinista tra il Bootstrap modale Invia e Utilizzando la vista parziale Direttamente nella figura seguente, rispettivamente

Comparison of Fiddler requests

Durante la pubblicazione dal modale cucciolo, il tipo di contenuto viene modificato application/x-www-form-urlencoded dove come quando si utilizza la vista parziale direttamente spetta multipart/form-data


individuato il problema principale.

$('form', dialog).submit(function() { 
        var $form = $(this); 
        var enctype = $form.attr('id'); 
        $.ajax({ 
         url: this.action, 
         type: this.method, 
         data: $(this).serialize(), 
         success: function (result) { 
          if (result.success) { 
           $('#myModal').modal('hide'); 
           //Refresh 
           location.reload(); 
          } else { 
           $('#myModalContent').html(result); 
           bindForm(); 
          } 
         } 
        }); 
        return false; 
       }); 

sto usando AJAX annuncio a inviare i dati dalla mia forma. Quando si utilizza $(this).serialize() viene chiamato il successo ajax ma il file non viene restituito in quanto il tipo di contenuto è diverso. Come posso cambiare questo ??

+0

Sto affrontando lo stesso problema ti piacerebbe pubblicare il soluzione se si ottiene la soluzione. –

+0

Qual è la soluzione? –

risposta

-1

prova con seguente modo in cui questo ha funzionato per me:

VISTA:

@using (Html.BeginForm("ComplaintAndSuggestion", "RegisterComplaints", FormMethod.Post, new { enctype = "multipart/form-data", id = "ajaxUploadForm" })) 
{ 
: 
: 
: 

        <div class="row mb10"> 
         <div class="col-sm-3 col-md-3"> 
          <label for="file1">Upload Image 1</label> 
          <input type="file" name="images" id="file1" accept="image/*" /> 
         </div> 
         <div class="col-sm-3 col-md-3"> 
          <label for="file2">Upload Image 2</label> 
          <input type="file" name="images" id="file2" accept="image/*" /> 
         </div> 
         <div class="col-sm-3 col-md-3"> 
          <label for="file3">Upload Image 3</label> 
          <input type="file" name="images" id="file3" accept="image/*" /> 
         </div> 
         <div class="col-sm-3 col-md-3"> 
          <label for="file4">Upload Image 4</label> 
          <input type="file" name="images" id="file4" accept="image/*" /> 
         </div> 
        </div> 

    <input type="submit" value="Create" /> 

} 

Controller:

 [HttpPost] 
     public ActionResult ComplaintAndSuggestion(Register register, IEnumerable<HttpPostedFileBase> images, IEnumerable<HttpPostedFileBase> videos) 
     { 


foreach (var file in images) 
       { 

        if (file != null) 
        { 
         string filenameWithDateTime = AppendTimeStamp(file.FileName); 
         file.SaveAs(Server.MapPath(Path.Combine("~/Images/", filenameWithDateTime))); 
         fileUploadModel.FilePath = (Server.MapPath(Path.Combine("~/Images/", filenameWithDateTime))); 
         fileUploadModel.FileName = filenameWithDateTime; 
         fileUploadModel.FileType = "Image"; 
         fileUploadModel.RegisterId = register.RegisterId; 
         mediaRepository.Add(fileUploadModel); 
         mediaRepository.Save(); 
        } 

       } 

} 

fatemelo sapere.

+0

Questo potrebbe funzionare per te ma puoi trovare che cosa c'è di sbagliato nel mio codice @Ganesh –

0

Generalmente, i pop-up modali vengono visualizzati alla fine dello body. Sono abbastanza sicuro che il bootstrap faccia la stessa cosa. Questo, a sua volta, significa che il contenuto della modale viene spostato in una nuova posizione e viene rimosso dall'elemento form. Mi sento di raccomandare un riordino: spostare il form all'interno della finestra modale:

<div class="modal-body"> 
    @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
     @Html.AntiForgeryToken() 
     ... 
    } 
</div> 

Questo sarà spostare l'intero modulo (e non solo gli elementi del modulo) quando il modale viene costruito.

0

Solo il file caricato restituisce null? o l'altra casella di testo restituisce anche null? Come commenti @Andrei, di solito le modali vengono spostate in una nuova posizione e il modulo non è presente o la tua partialview potrebbe essere spostata per far funzionare il modale.

Con jqueryUI ho avuto un problema simile. Non riuscivo a trovare nella tua domanda se si sta utilizzando AJAX per inviare i dati, è possibile utilizzare Ajax() per inviare il modulo e vedere se l'immagine è stata caricare

$.ajax({ 
      url: "@Url.Action("Action", "Controller")", 
      type: "POST", 
      cache: false, 
      data: $("#YourFormID").serialize(), 
      success: function (result) { 
       //your success data 

      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       //your error handler 
      }, 
     }); 

     return false; 

Se non si desidera usa $ .ajax(), potresti provare a usare .appendTo() con jquery, avvolgere tutto ciò che è all'interno del tuo form in un div con un ID, poi dopo che hai tutti i tuoi dati prova a settecify che vuoi aggiungere ("#YourFormID") su un clic del pulsante o come desideri. Questo lavoro per me quando stavo usando modale, spero che ti aiuti con qualcosa. Buona fortuna

0

Se capisco che si crea il modulo in una vista parziale, e questo parziale è usato in un popup modale, è giusto.

1) fare un modello per utilizzato nella forma con tutti gli elementi per la forma, 2) dichiarare il modello nella prima linea nella vista parziale 3) passare come parametro del modello alla funzione palo. 4) si utilizza una vista parziale, è possibile utilizzare questa vista in diverse pagine, è necessario specificare il controllo per il trattamento del modulo. in codice:

MODELLO

public partial class SliderModel 
{ 
    [Required] 
    [StringLength(200)] 
    public string FileName { get; set; } 

    [StringLength(200)] 
    public string Title { get; set; } 

    [StringLength(1000)] 
    public string Description { get; set; } 

    public int? Order { get; set; } 

    [NotMapped] 
    public HttpPostedFileBase ImageFile { get; set; } 
} 

VISTA

@model YOURNAMESPACE.Models.SliderModel 
<form method="post" class="form-horizontal" role="form" id="sendMail" 
    enctype="multipart/form-data" action="/CONTROLLERNAME/EditSlider"> 

@Html.AntiForgeryToken() 
<div class="modal-body"> 
    <div class="form-horizontal"> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.Id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.FileName, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(model => model.FileName, new { @class = "form-control", @readonly = "readonly" }) 
       @Html.ValidationMessageFor(model => model.FileName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.ImageFile, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(m => m.ImageFile, new { @class = "form-control", type = "file" }) 
       //This is Same as below 
       //<input class="form-control" id="ImageFile" name="ImageFile" type="file" value=""> 
      </div> 
     </div> 
<div class="form-group"> 
     <div class="col-md-offset-1"> 
      <button type="submit" class="btn btn-success"><b><i class="fa fa-envelope"></i> Envoyer</b> </button> 
     </div> 
    </div> 
</form> 

CONTROLLER

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult EditSlider(SliderModel obj) 
{ 
    if (ModelState.IsValid) 
    { 
     your options 
    } 
    return PartialView("_EditSlider"); 
} 
+0

Non è lo stesso quello che sto facendo @Pablote ?? –

+0

si creano due modelli: public partial class Slider: BaseModel e class SliderImage: Slider, faccio solo uno, slidermodel; in vista scrivo l'intera vista parziale, è necessario scrivere @model e action = "/ YOURCONTROLLERNAME/EditSlider" all'interno della vista parziale. il parametro nel controller è (SliderModel obj) bene, queste piccole differenze sono il problema – Pablote

1

Ok, penso che il problema attuale è legata alle impostazioni di default per il metodo jQuery.ajax . Per impostazione predefinita, il tipo di contenuto per il metodo jQuery.ajax() è 'application/x-www-form-urlencoded; charset=UTF-8'. Quindi, in un progetto di esempio, ho modificato la funzione javascript per specificare contentType come parametro del metodo ajax: contentType: this.enctype

Penso che potrebbero esserci anche un paio di problemi aggiuntivi. Il prossimo numero che ho notato è che al momento della presentazione, ero collegamento a un altro le azioni, così ho aggiornato questa linea nella vista:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 

A tal:

@using (Html.BeginForm("EditSlider", "<Your Controller Name>", FormMethod.Post, new { enctype = "multipart/form-data" })) 

Infine, quando l'Ajax ha presentato , Mi stavo reindirizzando alla vista parziale.Credo che questo può essere risolto con l'aggiunta di preventDefault alla funzione ajax:

$('form', dialog).submit(function (event) { 
    event.preventDefault(); 
    var $form = $(this); 
    $.ajax({ 
     url: this.action, 
     type: this.method, 
     contentType: this.enctype, 
     data: $(this).serialize(), 
     success: function (result) { 
      if (result.success) { 
       $('#myModal').modal('hide'); 
       //Refresh 
       location.reload(); 
      } else { 
       $('#myModalContent').html(result); 
       bindForm(); 
      } 
     } 
    }); 
}); 

In questo modo sono stato in grado di ottenere questo esempio lavorando in un progetto di esempio; si prega di inviare un aggiornamento se si hanno ulteriori problemi.

0

penso sono stato in grado di identificare il problema, l'Ajax non supporta file di serializzazione, è necessario utilizzare il metodo seguente nello script:

$('form', dialog).submit(function() { 
     var formData = new FormData($(this)[0]); 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      contentType: this.enctype, 
      data: formData, 
      success: function (result) { 
       if (result.success) { 
        $('#myModal').modal('hide'); 
        $('#replacetarget').load(result.url); // Load data from the server and place the returned HTML into the matched element 
       } else { 
        $('#myModalContent').html(result); 
        bindForm(dialog); 
       } 
      } 
     }); 
     return false; 
    });