web-dev-qa-db-fra.com

Passage des données de modèle de View à l'automate et utilisation de ses valeurs

J'essaie d'envoyer des données à partir de la vue et de les utiliser dans le contrôleur pour créer un nom de fichier pour une fonctionnalité de téléchargement de fichier sur laquelle je travaille. Mon code est ci-dessous.

Manette

    // GET: File
    [Authorize(Roles = "Admin, Lecturer")]
    public ActionResult Index()
    {



        foreach (string upload in Request.Files)
        {
            if (Request.Files[upload].FileName != "")
            {
                string path = AppDomain.CurrentDomain.BaseDirectory + "/App_Data/uploads/";
                string filename = Path.GetFileName(Request.Files[upload].FileName);
                Request.Files[upload].SaveAs(Path.Combine(path, filename));
            }
        }
        return View();
    }

Modèle

public class UploadModel
{
    [Required(ErrorMessage = "Course is required")]
    public string Course { get; set; }
    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }

    public string Uploader { get; set; }
}

Vue  

<div class="uploadContainer">
    <table>


        <tr>
            <td>Title :</td>
            <td colspan="2" class="editPostTitle">
                @Html.TextBoxFor(Tuple => Tuple.Item1.Title, new { @class = "uploadTitleInp" })
                @Html.ValidationMessageFor(Tuple => Tuple.Item1.Title)
            </td>
        </tr>

        <tr>
            <td>Course :</td>
            <td>
                @{
                    List<SelectListItem> listItems = new List<SelectListItem>();
                    foreach (var cat in courses)
                    {
                        listItems.Add(new SelectListItem
                        {
                            Text = cat.Course.Name,
                            Value = cat.Course.Name
                        });
                    }
                }

                @Html.DropDownListFor(Tuple => Tuple.Item1.Course, listItems, "-- Select Status --")

                @Html.ValidationMessageFor(Tuple => Tuple.Item1.Course)
            </td>
        </tr>

        <tr>
            <td>File :</td>
            <td>
                <input type="file" name="FileUpload1" id="fileUpload" required />
            </td>
        </tr>

        <tr>
            <td></td>
            <td>
                <input id="btnUploadFile" type="button" value="Upload File" />
            </td>
        </tr>

    </table>

</div>

Cette méthode est responsable du placement du fichier téléchargé dans le répertoire. Ce que je veux être capable de faire est de créer un nom de fichier en faisant quelque chose comme ceci.

string filename = model.Title + " - " + model.Course;

Je sais généralement comment y parvenir lors de l'utilisation d'une base de données pour stocker des données, mais comme je ne stocke pas les fichiers téléchargés dans une base de données, je ne sais pas vraiment comment transmettre les données de modèle au contrôleur afin de pouvoir utiliser les valeurs. qui ont été entrés par l'utilisateur pour construire le nom de fichier. Je suis relativement nouveau dans ce cadre et dans les langages, donc toute aide et tout pointeur seraient grandement appréciés.

Merci d'avance!

3
Plumbus

Vous devez transmettre les données via votre modèle à une méthode de contrôleur distincte. Ceci peut être implémenté comme suit (j'ai un peu simplifié votre code, mais l'implémentation générale devrait marcher):

public class UploadViewModel
{    
    public string Course { get; set; }
    public string Title { get; set; }
}

Votre action GET:

public ActionResult Index()
{
    return View(new UploadViewModel());
}

Ensuite, dans votre vue, ajoutez le modèle et utilisez-le dans le formulaire, de sorte que les données soient liées à votre modèle. Cela peut ensuite être renvoyé à votre contrôleur.

@model UploadViewModel
@using(Html.BeginForm())
{
    Course: @Html.TextBoxFor(s=>s.Course)
    Title: @Html.TextBoxFor(s=>s.Title)
    <input type="submit" value="Save file" />
}

Maintenant, récupérez les valeurs via une méthode d'action HttpPost dans votre contrôleur:

[HttpPost]
public ActionResult Index(UploadViewModel model)
{
    //You can use model.Course and model.Title values now
}
0
Jurjen

Il existe deux manières différentes d'envoyer des données controller. Vous devez faire correspondre les données que vous envoyez dans le Controller method

Utilisation de la méthode Ajax Post:  

Sera créer un objet transféré sur javascript. nom de propriété d'objet doit être identique à Nom de propriété de modèle.

var objAjax = new Object();
     objAjax.Course = 'newCourse'; // Model prop is string type so this value must be string.
     objAjax.Title  = 'newTitle';  

   $.ajax('@Url.Action("MethodName", "ControllerName")', {
                type: 'POST',
                data: JSON.stringify(objAjax),
                contentType: "application/json",
                dataType: "json",
                traditional: true,
                success: function (returnData) {
                    // Do something when get success
                },
                error: function () {
                   // Do something when get an error
                }
            });


    [HttpPost]
    public ActionResult Index(UploadViewModel model)
    {
        //do something with the result
    }

Utilisation de la méthode FormPost

Html.BeginFom envoie toutes les données du modèle au contrôleur lorsque appuie sur le bouton d'envoi

ForExample

@using(Html.BeginForm())
{
    <div>
         // Your code 

        <div>
            <input type="submit" value="Go" />
        </div>
    </div>
}


[HttpPost]
public ActionResult Index(UploadViewModel model)
{
    //do someting
}
0