2012-05-25 3 views
0

En utilisant Fiddler je peux voir que la demande n'est même pas faite mais je ne vois pas pourquoi.ASP.NET MVC 3 (Razor) formulaire soumettre ne fonctionne pas

est ici la forme:

@using (Html.BeginForm("Index", "FileSystemChannelIndex", FormMethod.Post, new { 
channelId = @Model.ChannelId })) 
{ 
    @Html.HiddenFor(model => model.Id) 
    @Html.HiddenFor(model => model.ChannelId) 
    <div class="editor-label"> 
     Select File Source 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(
      model => model.SelectedFileSourceValue, 
      new SelectList(Model.AvailableFilesSources, "Id", "Name"), 
      new { id = "selectFileSource" }) 
    </div> 
    <p> 
     <input class="t-button" type="submit" value="Save" /> 
    </p> 
} 

La vue est originaire de:

public ViewResult Create(int channelId) 
{ 
    var channel = this.fullUOW.GetFileSystemChannelRepository().All.Where(c => c.Id == channelId); 
    var vm = new FileSystemChannelIndexViewModel(channelId, new FileSystemChannelIndex()); 
    return View("Edit", vm); 
} 

J'ai essayé d'ajouter l'attribut « nom » à la mais qui ne fait aucune différence.

Des idées?

EDIT: Plus d'informations pour Jim et al ...

Domaine:

public class FileSystemChannel 
{ 
    public int Id {get; set; } 
    public ICollection<FileSystemChannelIndex> ChannelIndexes { get; set; } 
} 

public class FileSystemChannelIndex 
{ 
    public int Id { get; set; } 
    public FileSystemChannel ParentChannel { get; set; } 
} 

En raison de 0 ... * association, dans l'interface utilisateur, nous devons créer un premier FileSystemChannel puis ajoutez un FileSystemChannelIndex à celui-ci. C'est pourquoi je passe le channelId à la vue CreateSystemChannelIndex Create. Lors de la présentation de la nouvelle FileSystemChannelIndex l'action suivante doit être appelé:

[HttpPost] 
public ActionResult Index(int channelId, FileSystemChannelIndexViewModel vm) 
{ 
    //TODO: get the Channel, add the Index, save to db 

    return View("Index"); 
} 
+0

Avez-vous un ActionResult appelé Index avec l'annotation de données [HttpPost] '? –

+0

vous devez obtenir des erreurs? quelles sont ces erreurs? – Rafay

+0

@Tim Oui, même si je ne suis pas sûr que la signature soit correcte. – empo

Répondre

3

Donc, grâce au commentaire de Mark, il est dû à une validation côté client défaillant Select. Utilisation des outils de développement IE pour inspecter l'élément:

<select name="SelectedFileSourceValue" class="input-validation-error" id="selectFileSource" data-val-required="The SelectedFileSourceValue field is required." data-val-number="The field SelectedFileSourceValue must be a number." data-val="true"> 
1

empo,

plus à mon commentaire ci-dessus:

empo - peut vous envoyer les deux public ActionResult Create(////) méthodes (c.-à-HttpPost et HttpGet) dans la question car cela pourrait mettre en évidence si le problème est lié à des signatures de méthode ambiguës, qui je pense pourrait bien être le cas que vous affichez la même signature que le résultat d'action HttpGet

essayer d'ajouter le approprié HttpPost ActionResult le long des lignes de:

[HttpPost] 
public ActionResult Create(FileSystemChannelIndex domainModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(PopulateEditViewModel(domainModel)); 
    } 

    _serviceTasks.Insert(domainModel); 
    _serviceTasks.SaveChanges(); 
    return this.RedirectToAction("Edit", new {id = domainModel.ChannelId}); 
} 

original HttpGet (qui se sent 'bizarre' pour moi):

[HttpGet] 
public ViewResult Create(int channelId) { 
    var channel = this.fullUOW.GetFileSystemChannelRepository().All 
     .Where(c => c.Id == channelId); 
    var vm = new FileSystemChannelIndexViewModel(channelId, 
     new FileSystemChannelIndex()); 
    return View("Edit", vm); 
} 

et à l'intérieur de votre Modifier ActionResult, vous d attrape l'entité en fonction de l'identifiant transmis. pourrait fonctionner, pourrait ne pas fonctionner. pas sûr sans une image plus complète de votre domaine et de la logique.

évidemment, votre propre plomberie va varier, mais cela devrait donner une idée de ce qui devrait être attendu.

+0

Jim, voir mon édition ci-dessus. Je ne pensais pas que c'était dû au contrôleur parce que la page ne fait même pas une demande. – empo

+0

Jim il n'y a pas de [HttpPost] Create parce que je veux revenir à la vue Index, comme vous pouvez le voir dans les paramètres Html.BeginForm. Je commence à penser que j'ai tout faux et devrait avoir une action Create qui est appelée mais retourner l'index – empo

+2

empo - je pense que vous avez peut-être tort si vous utilisez l'index comme une action httppost. la pratique standard est d'avoir une «paire» d'actions, une qui obtient les objets requis et les valeurs pour la publication, l'autre qui accepte les valeurs POSTed et effectue ensuite une redirection (PRG). –

0

Comment pouvez-vous avoir Model.Id lorsque vous créez quelque chose? Peut-être Model.Id est null et parce que vous ne pouvez pas poster

+0

c'est la même vue pour créer et éditer. Si id = 0 alors créer si id> 0 puis éditer – empo

+0

pourquoi avez-vous besoin de cela? new { channelId = @ Model.ChannelId} – karaxuna

+0

Le champ channelId caché sera affiché – karaxuna

Questions connexes